<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=2">
<meta name="theme-color" content="#222">
<meta name="generator" content="Hexo 5.4.0">
  <link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png">
  <link rel="icon" type="image/png" sizes="32x32" href="/images/%E8%BF%AA.png">
  <link rel="icon" type="image/png" sizes="16x16" href="/images/%E8%BF%AA.png">
  <link rel="mask-icon" href="/images/logo.svg" color="#222">

<link rel="stylesheet" href="/css/main.css">


<link rel="stylesheet" href="/lib/font-awesome/css/font-awesome.min.css">
  <link rel="stylesheet" href="//cdn.jsdelivr.net/gh/fancyapps/fancybox@3/dist/jquery.fancybox.min.css">

<script id="hexo-configurations">
    var NexT = window.NexT || {};
    var CONFIG = {"hostname":"zhengyidi.github.io","root":"/","scheme":"Pisces","version":"7.8.0","exturl":false,"sidebar":{"position":"left","display":"post","padding":18,"offset":12,"onmobile":false},"copycode":{"enable":true,"show_result":"flat","style":null},"back2top":{"enable":true,"sidebar":true,"scrollpercent":true},"bookmark":{"enable":false,"color":"#222","save":"auto"},"fancybox":true,"mediumzoom":false,"lazyload":false,"pangu":false,"comments":{"style":"tabs","active":null,"storage":true,"lazyload":false,"nav":null},"algolia":{"hits":{"per_page":10},"labels":{"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}},"localsearch":{"enable":true,"trigger":"auto","top_n_per_article":1,"unescape":false,"preload":false},"motion":{"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"slideDownIn","post_body":"slideDownIn","coll_header":"slideLeftIn","sidebar":"slideUpIn"}},"path":"search.xml"};
  </script>

  <meta name="description" content="设计模式 - 结构型 - 享元模式">
<meta property="og:type" content="article">
<meta property="og:title" content="18.享元模式">
<meta property="og:url" content="https://zhengyidi.github.io/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/Design%20Pattern/18.%E4%BA%AB%E5%85%83%E6%A8%A1%E5%BC%8F/index.html">
<meta property="og:site_name" content="Zhengyidi&#96;s 学习记录">
<meta property="og:description" content="设计模式 - 结构型 - 享元模式">
<meta property="og:locale" content="zh_CN">
<meta property="article:published_time" content="2021-07-12T00:00:00.000Z">
<meta property="article:modified_time" content="2021-11-13T14:58:22.510Z">
<meta property="article:author" content="zhengyidi">
<meta property="article:tag" content="设计模式">
<meta name="twitter:card" content="summary">

<link rel="canonical" href="https://zhengyidi.github.io/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/Design%20Pattern/18.%E4%BA%AB%E5%85%83%E6%A8%A1%E5%BC%8F/">


<script id="page-configurations">
  // https://hexo.io/docs/variables.html
  CONFIG.page = {
    sidebar: "",
    isHome : false,
    isPost : true,
    lang   : 'zh-CN'
  };
</script>

  <title>18.享元模式 | Zhengyidi`s 学习记录</title>
  






  <noscript>
  <style>
  .use-motion .brand,
  .use-motion .menu-item,
  .sidebar-inner,
  .use-motion .post-block,
  .use-motion .pagination,
  .use-motion .comments,
  .use-motion .post-header,
  .use-motion .post-body,
  .use-motion .collection-header { opacity: initial; }

  .use-motion .site-title,
  .use-motion .site-subtitle {
    opacity: initial;
    top: initial;
  }

  .use-motion .logo-line-before i { left: initial; }
  .use-motion .logo-line-after i { right: initial; }
  </style>
</noscript>

<link rel="alternate" href="/atom.xml" title="Zhengyidi`s 学习记录" type="application/atom+xml">
</head>

<body itemscope itemtype="http://schema.org/WebPage">
  <div class="container use-motion">
    <div class="headband"></div>

    <header class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-brand-container">
  <div class="site-nav-toggle">
    <div class="toggle" aria-label="切换导航栏">
      <span class="toggle-line toggle-line-first"></span>
      <span class="toggle-line toggle-line-middle"></span>
      <span class="toggle-line toggle-line-last"></span>
    </div>
  </div>

  <div class="site-meta">

    <a href="/" class="brand" rel="start">
      <span class="logo-line-before"><i></i></span>
      <h1 class="site-title">Zhengyidi`s 学习记录</h1>
      <span class="logo-line-after"><i></i></span>
    </a>
      <p class="site-subtitle" itemprop="description">休对故人思故国，且将新火试新茶。诗酒趁年华。</p>
  </div>

  <div class="site-nav-right">
    <div class="toggle popup-trigger">
        <i class="fa fa-search fa-fw fa-lg"></i>
    </div>
  </div>
</div>




<nav class="site-nav">
  <ul id="menu" class="menu">
        <li class="menu-item menu-item-home">

    <a href="/" rel="section"><i class="fa fa-fw fa-home"></i>首页</a>

  </li>
        <li class="menu-item menu-item-tags">

    <a href="/tags/" rel="section"><i class="fa fa-fw fa-tags"></i>标签</a>

  </li>
        <li class="menu-item menu-item-categories">

    <a href="/categories/" rel="section"><i class="fa fa-fw fa-th"></i>分类</a>

  </li>
        <li class="menu-item menu-item-archives">

    <a href="/archives/" rel="section"><i class="fa fa-fw fa-archive"></i>归档</a>

  </li>
      <li class="menu-item menu-item-search">
        <a role="button" class="popup-trigger"><i class="fa fa-search fa-fw"></i>搜索
        </a>
      </li>
  </ul>
</nav>



  <div class="search-pop-overlay">
    <div class="popup search-popup">
        <div class="search-header">
  <span class="search-icon">
    <i class="fa fa-search"></i>
  </span>
  <div class="search-input-container">
    <input autocomplete="off" autocapitalize="off"
           placeholder="搜索..." spellcheck="false"
           type="search" class="search-input">
  </div>
  <span class="popup-btn-close">
    <i class="fa fa-times-circle"></i>
  </span>
</div>
<div id="search-result">
  <div id="no-result">
    <i class="fa fa-spinner fa-pulse fa-5x fa-fw"></i>
  </div>
</div>

    </div>
  </div>

</div>
    </header>

    


    <main class="main">
      <div class="main-inner">
        <div class="content-wrap">
          

          <div class="content post posts-expand">
            

    
  
  
  <article itemscope itemtype="http://schema.org/Article" class="post-block" lang="zh-CN">
    <link itemprop="mainEntityOfPage" href="https://zhengyidi.github.io/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/Design%20Pattern/18.%E4%BA%AB%E5%85%83%E6%A8%A1%E5%BC%8F/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="image" content="/images/avatar.gif">
      <meta itemprop="name" content="zhengyidi">
      <meta itemprop="description" content="">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="Zhengyidi`s 学习记录">
    </span>
      <header class="post-header">
        <h1 class="post-title" itemprop="name headline">
          18.享元模式
        </h1>

        <div class="post-meta">
            <span class="post-meta-item">
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              <span class="post-meta-item-text">发表于</span>

              <time title="创建时间：2021-07-12 00:00:00" itemprop="dateCreated datePublished" datetime="2021-07-12T00:00:00+00:00">2021-07-12</time>
            </span>
              <span class="post-meta-item">
                <span class="post-meta-item-icon">
                  <i class="fa fa-calendar-check-o"></i>
                </span>
                <span class="post-meta-item-text">更新于</span>
                <time title="修改时间：2021-11-13 14:58:22" itemprop="dateModified" datetime="2021-11-13T14:58:22+00:00">2021-11-13</time>
              </span>
            <span class="post-meta-item">
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              <span class="post-meta-item-text">分类于</span>
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
                  <a href="/categories/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/" itemprop="url" rel="index"><span itemprop="name">设计模式</span></a>
                </span>
            </span>

          
            <div class="post-description">设计模式 - 结构型 - 享元模式</div>

        </div>
      </header>

    
    
    
    <div class="post-body" itemprop="articleBody">

      
        <div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="Oh, this is an invalid password. Check and try again, please." data-whm="OOPS, these decrypted content may changed, but you can still have a look.">
  <script id="hbeData" type="hbeData" data-hmacdigest="dd7fb9dba3c6b051c4bc18a92f1e848cf9c181672b93aa90f61a3ad35bb2effb">22064b17c03cb0c0e58c99349b6889d0b31470871e725085fde7c8feed9af7efef7f074cc0e0a7eb3b386f602065414483d952ab864df16e749de9d740ee6f8bd8cc0e5e125187d8660ed76edb437674fd9a9fddf0ee3442fbaa90ddec28a3dcdd87419c9d7cc612d27f7a0a182b76bfa3a6dbc905a8d34624a7326e6946490a842d54e6f9d51b7a8b378319c42f432768cb3e7b8ee87e9f47c875949e7221576a7a964234ec5a03a7b473962828d0387b8649f35340e40799c3dd31d3c3ddbbee5ca47caf1f14687bcfa546ca12f837837c420c7edb427bd395f248726e792f0e16f65b9c4794b99f5e06fc6b2c1b3ec37a729555a44e63dcb81e6f6c4458c9e9aac76465b1cc94871bc91ffd15ed212e695c65ce1798b51a3cbf8f9be507a9838a833cf396fee3fd48e9e67ae049c810e34792231a02e368336d638718adbb3b67c3b34f1b6bb93f4d535f5934c0a9131531655594348a5d7a899ba4bb81e4df7efe4a39f5caa04086c3211d0ddb7b270b601fcdab768f92884e5e5cc66ca0a040d1726c5ddb66b7e21166fab581703332d703e80febad37fa719fc24d5ac2baf7f91eec2fd4bbea0bd0259c62c729d9d2b630c0939458479a5b0ad554f3c620396cd7a0de42dd1b28a65b588c6319dde4ba88ef1a51c8e7f8a96beea07cd2778db28f1338d11af073b5cfd3f235d8ded91c7a0e56fe258c8fadc9c708e9682a9d0f2d50a1d44b997bc0491c11b5910c8d8bfbc1710838b6cad42fd2557db0636cc284d455e525d3f8b95a56181c7de944987ffe6ea422dbc1cfba12dbced532167a1814a4700ab19c9cfc5f4370c5055b4338bd79103d811480ccd76236ad78c317d8e0848a0c3c436b3f2773f70515d5a767ebb298f96a8a6287954bb0d73e8c1ce1ddb8d596d2519378be334bead014b58cea2422517cebea0918bfc4f67f52ee8ca6e5d2db03be0d97668f2fce12a0571b95667eb1b3a998e24209b314e3da7fb5124446a01267ef181ff8a81ba8d444350465e81f3934a4bb49b6c772b1f2f18ec8d459e2f8471b1c8962dfd3fbb540b65959cac169680717c6903f8467dda11a4d10e65ab5c38ee4e8944ce667a8ab4081fba91ef9a14aa53cbb69bbe7ece696bebf4871ba0ddd7f878aa9f88fd9b3aa0cb9299978f97a390371d7842c843164e4d708a32fd2c4739b8a100d2a70c542bffaa9a53f9e1c3963de5db8b44c0ac60b29795020716d0d077777522b90af62da550c9ba9301750bd768b575ee926994107f5536bb773927147cc358c3b8416968bdec616dd8c86f4b7901a52e37a838be94df5e8f1b33ac5421e6e23a1caf4a5d380a7301dcff814173f8b904893f3cc161eaa732233845f4aa033b0d060e6600fb6db5b2eb5f3ce2f407438d6a6d2a53f45c04979d0db9e75769156d52d318fcd69bb237598dbc093d0c150b8c347744895a3f78c5741031eaa39e7ae738987a5ce430a77263e27e1e450caeff18701e3e317b48e12f46812b521f279e4b8c5ba52d0d557705641386a63b3417459379f32d9163b36c8836465fce554af0f579a6e50863916d3a362e90b4d5f0d7027f62b8f6d544a09605634726e4cd97e5c9d38a35ba0b7845e2a6a12a25cf396a52c0e99a62245fb0bbd382306a0be3f26416f1a09e78384b396f40a64fb11b4c728bb2bbdd823e0a3e62702b44af228c2fee2133efa639a3e1a886be6c7fe42eff0cfc88b0433a4c2e5df4ac7e8f8e1e71cf94d06009f44edf938fea81fd865b4af07c2994e72f9f8a9332a466bd7dd44dd468a98daa3d567495a323c90fc8721e162a6f8a4fcafe7e7cd8dedd4a6d31eafcb0cb28519000e9c420d867ed8251657914406105a2eb98b6d4e023d5aadaf427011f9f4a987f0dc12a33d7cf6280965511063331aa4a5ebda51c37f5ea2e5016d5588a020adaf88db75e34b99dd919caf999b6291e34d586a4b35ee34b0241275325ee646f52496d876983418938a96f1aba2b9001524af44c03d46777f66a24473570ae79aa448a9bef3f9bbf6d8b29cb6ef9c045db549d250abfed456b480d9cac80b54a1865d986942bcece6eda5e4b8c5211201a466b778b9ab5ce30eef672ca169b58ebe98c4c1f4fa9b6a27cc39ab24d80d6c0623922b282acef5200c701105c0baab42eebea5a58f5ccdff292a0c61ff53c016202ff472f98c6f7ee4270dfa3192469125cc03681748f9ada49d58a0f92f2e547f28275aed8b670f4f9d3d9bd4e19df01ceda2f1b911c6cf3b8f33c19b2944fa1175cc1f9488427fc55c98b5adad1389830b4c60681636209e623141b97bda97bd8c2c2ed822f43bf53bb685458de01b5eef043a674adc62cbebc28be257233d30d56552c7e7a8d61f8963dc3323664258a2e423a5bb639f281ff24c4b4ef8bff1ef49f7c05b73171810a1d7d506bc5e6a779ed0007a3e7dd64641a179f7cee98e290b7b97fb69582f1d5468e361333efcdb7534b90da81fc61eb49dda0c8c5132fd40d716d39a4a40fb9e19fc3d7b2e1e963aa23df8fa0d632448031c3cfc37039e58ca810b89cc19c80ba6c98c42d69be6c26852d553b75a63e9b2144c67c5f9c38f7796e7359a49c796416041124e843e72d4ddd4dd2b88212d98fd2dcd725171d2f4c3027132cf2bb2e90e62f1ddf8a4e57bd871554428795674cc399245c18898a5ec97b8532949d21402ade7ae11a90a22a0dbae950864319a7378224f42c68019928a2b64a2b125005e2dc6423c811bf35e617bbaacb1e593574a765a2380346badee2a45b1628ecae4392ce60b6b4114caacc62f8ebd3dd67b35fc408c5ce43278386081f9fedaafa357c83a389f17d086831c6c6279c84003416bcd1401f0bef009d4c06747e16ce17f561b48e2a9e7a2caf16dabdbdf30a1fa9efe1e20160816afb1e6da9b0201da67d488c75f4fc7e00647db4ea5831408820f95a360b5932154b54b5d527d472cafedeeafe0e8bd18a5cb24c2cac0935585eb9f7bd1e4ffdc9e098bc8c221dd1f6960c70a3c3b4e9b9e487ae39b95b29198ba9df0667c52c700717d56f786a46cc117a38f561425e3e5735ea2bc9c70d814ea78bb575249151f9a49c54ebb40169810cfb7519532facdeb0893dfbe3ce0c1694e09882641ec459f5fc2315cdb97dfb2939cf336fa1972e7795e2f0ffd4bb2929f61cc632ec2167f1a9439b66d46b5db05946ecd1bbe5e9943813d0c7d93dd413a447ac0fb4d185f201d947eec479c5d8c3fd183c4be2af872a4ccc1898d809c122bb72b32ba83b2e34bf49aa06be3393d5809f3d792ebe45c40f2a7f70cecb9b2c89daf2a99c89bcb6fbda80724f692914aa7c8cdbfda42b4d2710cd522fd091585cf86acd423718239cec820ca794c3394f624caa4555ae6759cb599b05870f5e9620c13ddd7cd31438a6d89c058d254a601b241691eb0066fce9e05028d8c464ff8a890fcf4f7e28b5d50de2fce88b1707b841b8e9cd9ee06f348e1c3d918a3605ceedc48bcea27727a2403b198b33a2345a64a01b1d02d889af4a0f7f75aa7cc4dcc6b4fb3e8f3020dd2f68bdf0720880823e43df6bd5fd13d9488d2dc8faf967d51d6ec9da3a42025e756864fc09b54352c6e51b796c1afc0dff5cacf02a2c4042027f26b9d686ad4c4cecfd115e5e9c8856db394c144cc007355e3e2206b58f28e8c1b80c0ea357b52411fe19970e56615df37b3242bbf38108f428cf7c503f668a9b738f4e39bf7f4b912aff32b77c5735c43c20e2353ccedac4a56c8ba9d7cd990b860f762cabc5e8b9990cf61b4ad764c8fb8354f689d03366220b0fe0c93d897d4b7dc66fd3c7267f8811446ab969cef571407ab2cd030d38f8704ac68d848fc2d626283561a4c859782ec43fbbad46f7216ddc870d97dd72f04a0eb45dd3d2987ae1b59a6adab93966f8b9d01cc04ca77f3caccba6050a95509401a3e4f51a7f37174fbca7c86435e0824ed18658774e8244c34877668f1c2830bb9cec7d5e48711834a8a69fbf9b3f0a23569dd8659810f1dafe2c8475d89072574b829a1cf1e591a3bffec36427dc7ae3eb3eb7d7f408b13785df58c5c108969e6010e08f41215137e32ca3cf6b02bc3ff3dc7a846371dc2b09709d0c975c753ceda38c43be3cacf0c790dc16e29cb96809018cefa2fd7d69855793163e1bb49d22e34d03d97ee6beadb184d03efba661bf9832145a5c5a7cf349295b3e80a7ac0d37defb7d34529b5dad23dab5fd458dfde4f594c20b6a74760b1f4f020903e47b6c963b85c18a830e57bfeb06dc006de2b3fac79a310fb9f0c05ba5a815986a15b06d5c44cf9c6c66b24653b4ffcc4a99d4c4c54758018fb3170d9bb41f70b549fa682db3a5e4c6bd27e3ff5fb370181f20d8275ca2f640625b8991d1287960c6ee23efa282fbb3a407c2cf7be511400048b6f0c150a40eeaee27e94f69dd402dca22ffce0b1a4c688c32093a6af5c96013cbe2c42f33c10a8e6ab865ea8decdf955591d61f76028bc1edfd8c7f3738ffe101a2eb5123cb1ad034484f8bff7f58b5714701fde4d074f76edf1d9a65d369fe4931da1c08e4ddf04df3c873c558851f1492827ebe8abcf49a3d5cf0365914d06b3be4028e6af926911720c5b7e71ffe829157ef644e454373c20ba977bb1f10dbf9030684cd14300718363b7f05d84ad0f7abe5120e0fa7355d61b05dbc1e489c0a3f72cdd0440978f0b9421f5a0627d14c54639c81e5d181a51b0b24230560d824f365b2832f28c8afd9692763a9539af82a00e619dbe9142cc1fda1540ee15022342f62a73f8be404de63ad3dea1b415f93568d176e9ccda3e8307e08f64826a9d97a7c8498a78379d95b5fcb3f2eb9f110505529dd279d085ccf0314a91601b2d8fe094b241c81648097b89c6424156345055c762436c4a4410087e9bbcdec274a0bb13c7eea034d4dff30873a56d7e271644c57f648cea870345b9994caa7b047e14733a09bb50b0754dd23b1bac34614fdaee5cb2cdbf5a6d25a41defe109c5d377e5b97a010ee9067b1f9ab8dfd31a0fb9c37e0b05c37358ba95501e1b481e8f08dcaeeb7d127a55bcf8f5fe3af624c05daf0e8713cc88869d11ccb06438abdc8445224b67d2debfa0486fb9f0e45fcdcc549c24c1913679edf899d55561e155a4d3782fd96a6b3d33d6d31df806b8a9b8b6c7eb875137657660c74e9587796d932e22c3eb5a1f22d5cb9d14eb1b7eca20a143f968503d1a26506eb2034ca634bc4a94a54e5f627db8a085bdcfafbecc95a97e475b32b13d7a3e020e3dd400aaa8089f931cd84672ca1154ab34f9aa68d5164146e106db4e72d04e817a16ca15e53bb8549501f5981184c1080ad4cbe54fbcc941504e53fa0b23b04197052bd7245c0a2746b74bb277f7882acf11b27fa3c6a338d0bbfed568fec8c6241845e669ea2e0d76f5fc295de4e32d321faa5b439ddc01071709df475cc1e5f871081f80858ecd5deb8adf1bdd33f699bb587043a33e8dfb1439ade7d19096f686800fccdb08bfae3f985b8d76666be62db3617ac116a47006d9ea7b1f04736f1546e5b4fe580d8bc5b80427dd07ba2e6ceb0fd58715924effa244f118936e40a6358c2dfbaee0dd7e5a8deb0911f86742be8ddc10892bd8e4e8b7016773c3f929b2c6b961e8fab172517a86c4f9c408c066c7fc0caa382659f464c3b7612ef8e3963260c7cf1afbadb1dfaab393329e9885a82683e79a8f42e835f9494d5dab801b9f8e9effa77af43e573465fcaf340dfeb46a10350d5b052b7fc095adad3f19b734a022b70e671eb5b3158dec8d6cbcd3a6b37fd31c88f057ffb18fcfa71cb2140322b088f1373aeeaf4ff43901cb3749facfd1503d0a755867067a6fbae146928951a7533c07fe8331055cbe9d71de79d1be3aae398b7092aaebddcf92a85dbdf75c1c003337b39dd125a4240c2e2c21e57a482db7c362a3b3bd741c0974b38c50581071f31c27d2ea0bb21bb60ead660490beae33cfaa52375a0751969aa8fd2a10405be1374e3a83e120524e50384520cecc4fa8cc9134a779b0f5d28846e83b7b14465a66a4f0643cfac32edb1a76ed3cda2f640228fa45842cbc5a7a8f6b1165546db68286f63d1e96f957cef338b2aefb7fa399081b648c639470d43fb336d70d82928169daff4bd3ed854dab6fb6e58fed189e58c9f59c05aaf74208ff5997125b4c03508cd4be961ebb38a9bad0c5794f4c863723ec7a23cdc2c8911b353e789cd66364862a903a3cc54e743980202d0c080d717c8775350f96be0581904f50e4f7d02ae69b19650d988f7fa648981338afb558aacaef3f9b8557289adac25f6e0b0bd32f80cb28545a33aa3117ab2723d6799c1a0fc8199e7c6fcd196694c027ef301d50fbcd709c5e974672a6c5c1b80b6b9fb0eaf0ced1f919c933655ac434f1dfea261058ccee75e086e61cd7ca2b3e7c9ade91ba476f03cd6a67d9c41a388af130c799400ad84fdb5fdd88ec148acab3b9b7dbe2bf4d07da7613b5f1f4d2579f9d729138106c101d7a7ac6ddab2b86deb1061610f1895d3dd91fd6fff8738dd2a79b73952d5231bc2dab0a94cbc4507944a6225790c4884bb04fb0f56eeb3d5de194ddf6a77af0bbe4dc0a6dfddcf547ca5da76867790548b0b0ae5a83dae27d5216bd0ecbaf3f6d4be640a5412b4704d6b1668230dac7de7c29f9eb33e5258afaed54d995cda32ef12e6f5a4e838d93d89a711a7b35ad074a118530526201ccb47df8e38b687cf601a954d66d6e11b2dd30f6471a14c6238b2feffbc3783fddeddf5d08674daa5764f207744d163431de162d910f22768e05eb0d33dd570369597e7411552b7b33d7838d536747d0b8ee4fddea3e9e38079e351a6f1374cb9e618a32a8fba77fca9be57428c9355623bd93322bc6e3e37633de7da1c4b1db786bea4dfff8c2437d4d9bb38a5fffc9704736aa49ab3ea5a435aaa64bdf37c799e777ffdebe3c6519648f704af73a0d8151696282600b2bd147536c9e5374cceac0ab2877fe5272ce5d59b3fe0b55ef9bd78fbe7659f0ed27e3644327ede2c1220ef2ecfc2774a3cf5fb7ad30dcf12c39056a16c4858bc15d9d5e44a4012781a425c412aed69b3a030110e6d582277cae39aca2261b251b4f9208f8d5988cd777767047f34aa5eac1504976b601c5311ade6f9d384b8c336d6841fcdfc7f8f896a1c07770e241f6b127d6224015fd8c9e76d7794e53116b979881e3766605c463d9a5932a1c93eda48578ea4d27df0349d67c798d00753e4cf6376000b4f4491442572c6262ff1e010b7662260e91e8f200edf6d112b28e8c96a335e63d827864b2d5fb01154673bfc4f92a26fe306a7223437d096e181980a5ad93b12cfb84ad7c6babc8b3a370a09a4053bd3d27acc51a31f6b8f870e30fb33457f0cef70001d25929a5d8a3a2f0e7560224153e17baf2f74a2c603d6de5702c7a1e7d3ffd4b8ec96289108d948141e8391ab35425e75a7d10690cb3c2e1a7e0ee30dac9bb35242e03c2bd9ca77af27812df935adae76c0dce2a0d814baa7b0a11c1eedfe624a300dfc3e93f485de1b7cc454e1adc6ad019a24f9f875b4806d26b7167260cf7983bd6640765edca6469ea2c5b6adee518d5c88766912cbb1f3e0df0bb98c5090fb48efe8223aeec799dec377e723ecd4757c2bf1800d9a9285a46573683dca21ed3a67cbffdebd014039860f69981a5c372e72a17f5f7119647b164faa00b698add21e33ac572f24611e1a5f0641aca8b63ad11819ae5f9af92402aeb5309427d4552e4c6119b58cc9b02d73d77e02415d25386acf8ff89e46d53b9365c89538ca55cf9aeb62bdc2f681b275c4576d01b64bd5677783ec5deb4b3c751c50ce0f276e1020ad7e165dcbb3ca8bb58e7a5a665707a9797592f7492d7e3610bcc3b4039866b19051b4da6b187f171f049fc57dd4712935140eeb5bcc786cf18c8f875d8cdb75b4c574dfb86c0a7cf3e7e48dd062c44cc11515cbcba8e7ab65e93f774fbee86788c0491f89f5cd125784951811e723bd35ce55ba30645b933ca9befb092efe5304563c404c2d879225ba1375377e2917ed6a7942f024264fc6732f84474655f7242c3486c0768e13a73cf3523d8c4ef21298bbca0f1429a62570ef8fe3253ba62868fd93b73773ce91b04bda71ae000c419a74ccb08b0598fc567ac4aee685fafdee38be4705d6ed36a634867487640c07c0c5ae6d70880a3237af742809b17b232fb67eca24dd2c8355a37835e37f572d7f3940862e2a653544043da1b93d9958a0b552349e5f15ae23e4ac002a1c17a16a8c55329a2b61160e89426de8567bbc38cbae16d971f15608f2e810361d5fb21db05a44524ad6198bf30f45f1812672d98faf17984cacf43b59918e9867bb40074dfeabb74dd0adf9b0b6f8c47d07c68b5f4c3292e5900082c1aaf120f5b72f07a7c3710bafef459814f22cab5833769d777816ba1ed6d417a402a0060441b9480f0b144859d79b460f63c19cc1bb6da5e00714e6807161296159d44152e129daa6f4be25ac5dedb485491fc1f9a55db788b852389dde4f95a80ded7034a8f4ae9a7ce63687823fc565d09f3b59c671039d62307e18582cd54dfb6a14976415ba6d639df8cdf159eb91e8f00473b6d50bd3d49f2d49a2e0a7743f4f43d30f597bda3fc28538eb6e00e56daaf0e1b839d424cc9f2531911066ee620336af8a1b61bb6c5f47da3f0e989a0633f680f8dc89cfa1b63a99bf7a5c4ebadb58678ecde27edc9ca463a35244bb2dc72408d1a8aad1d36ef58ecf4507013e02d4355b344bf65d0eaaa22c054503470633af29e04ad2c4f6d0b4fbad1217ff8196c445b0c2dc8e70eb1a6e8128c4417514302df7c0a9a9121eed9038e3979f29444fc726e5a3f5dfe60cdf2551a48f4204dd8d3234b28b89607b7d60f058d824264d10f1d652124036ac6bbcba5a5861c7c641024644c3c90db8ebe69b5ae2f75d56d25bbf700486170458532ee09d209b7e6716cbff17912ccb6fe61136edf947f1490c3e7d258a114e42f1499476ef033b77f25a73594b0dedd198a9d4ec0ea07f251d8ef9c5341cbb0f48bb32b5b1fa41caac28cae7162fa0ad2aee9bfd26cbb6ab33d7b6260f560b27967fb408d7e3bb5c081716ef857051f286e8832343f6e58a8e225111d63147b0dfa32a95759d5a11459299f688286e542f3f4ae1ce8fc6f5e6def278c19b7447ffcf75b4a25cb98d0baaafbcc2c5369140a86c90327b208b8453644e1b123a0ea0fa6e7e644c42d8f28aad3adf36b73e5ed234e34890b1fefb109afd5d8da3a18cd7b9059671800633fd2014ef7b908cbf286511842bb8a5cb21fdf32a302ecb8d144e0db5e283549f88fe9259f02fa8e86b503a8a64471cabdec5ce21d0d58665b26acce9c921c814d1d6d4c634b9acfbad346c28810d5191d8e8ced18fe159ba4cc1e449c3baf013592289ba14b35b1aa98eb1e4ed6b8e6e3bbdc447c1481cc72dd1221d5475f9ff5421498a1b66f93cc7bcb7128107c76fe45f6d6ac787bbc8a9e3508f8b041aadf4c2dcda1a90f6433daf412f8dadf423553614eefbb7798896da343e994b6f405653e88a2a2133e38b811afee1fd2553bf4101aa5359a994c88d0c0c8a174555a18dad1ee5d09619a8ea526e5b54711fd970031552b86cc504950562fe520acf769f468b5b464ac6be0d261fee738047b88c2a1c22bae3ae802713a14c1945594b4fbc5f59cf97f4704c3a78f0bff5aa66d98bbb37eea0adb41fc50dd615e4c20572c5a4d62be26e5b28c91b2ecdf9de3d5d12e635899a41a5db7af96770abb0a370d7c740593f3a7795157d96b58ec093d4c7271b5ccd5b74573d00b7f5a1d46617dfdd057feb238498ef614f14e0188dd3e0a6b2d4751c5d28bed625e0f5889afd4f75bed65e97d7585902374ae8dbdb13e5e184c4b1a3ca740439e767b639e3fd1905fa78614330dc1306e33f93ecfdc968d32c37c6866b52726e16354c0b05cb2fb76630746da3e1d90a146084e9546b2dd9d8fecd614a3b6bd0f7e43098a09b223f850bb824129f4b78487a755d0342687f6edcf86a033a342319f1b3be1c09a95c5a98b73623f646d388209d68d6910c5525f775567054d2905e4ee74c17658abfd5c638f78dd1659fbb5c86c992d74a43191d9550638dde8d319e7132433590347e805ea8b4d3a9d1cf92d003950b19252b8d68dcb594c2dc82a493d6c7bfb8734edafbb108cff0524ef185c8b2a11164d9e87e5140dddf1e84553d2b83c3188b5f68a71e42ed3241a966c76fa0b32e735dd0a3d107d5cbbc05bc3a7081c512f0dd1408eaeacacad6a7eb5a8c2b942be82cb58ecf57b9152bea31b87b00b4758ee8ad3ec424ec89fb6111173a9913566ac5b0368b76af529cfd4f92b4828c79f89c5bf4a1b7037e47e60c8944a921de71a1de7ae9e93f74f990106f08bc8475170939e35904089fbfc5b6dec8e3e03c6461621662f3e0fa9f61644b08bb9fe2416973587de0b8f8b80833bc527c735832b6353b3ca3871b673a8d94c7b176311a8fd129eb6ca25c189f99beba2066c965066b75ad54b1dda284b1cd67fa32603d7c02658f6e4e0834988709578b5051389c219debfd0b208441ca0303c645c99543c58a80d6376a4527442ae6005740626929e005bba059e00131a72c82b0f566ccff0edbd649b050c26c0993bebb536feaaf45b3134d7e48a42871f129057175266bbcbfd48d8fd5c85d2715abcb33f965eaefd1ec153156a74276ac828fecbe7af5f66358d2fc0d2e47164309da74239eacf92ef85361a60aba86cf023ce526d88d107b702f60e9afa9f3f88e91854e299016a59a3f6c6bbc3846c0335c93640c6b097af3d127872d36f3c667920d8010ef806da750f526175f4b800d62d4326a174a9d3133b4c46f029b045a0032f3db9029ae94825e3414cb846586048584777b835ef3711e413400d3e7d82528bf0e66f6b37ffbce2fa422218ea68688bb573a381a8177b8ac861d0ba0db28f8a96b8e1b00ead5774086f911e252e845f4de89503949cf16aae225ff51fba3943ddfe5af80a0a0483fd8ea02a7925460dc370f467ba545aabefae46fd7e8eae0bf1b8188ff21524fe1a15e4835cd1940d74f9e4ea6c9f8f1c9c8cb435655b722f1258ddcc0375b6b4fe100d6222de1cba4c8bd2ff8496febfc7427ef6fbce0030af544d1eb7148936fc42875df4f40d02e26e1a59d59539a185895b152829c7c9a088dd0ce55af84289aa2507a152465c4d6bdc5b7b2b260042ae712bacb34cfbb9a239b340296fbdd5d81f1cc4b529edc4279994d4d2616379d04b639430f6878387c57ac5e087af216ddb987aa3fc290332dc02710ebddbacc8a26a8e8f216f4e6b120939e1de098de3ba82c6501c93ead94dab006f545643e2ce2a26547f7c94baaf5d771de9569412ea44b9a0ea5945767c5f0fe9ee7e5018cd1de647fc3408f3e675637a7c8e8feebaab55fee62c2af1fbb64d872437bbb897e91c495b72b2079402761bc072f447047a6b9d05d21294a9a825ddadfb39b90f7b2992f542a60cf174f60648870dc1a25b0609e32fc06881808c924928c95b98fef63b737c87d8c337193ffaebb67c4901e46a46b9366856deaa5171710542dbfe034e9eef928c310f4ef1567b7759e33e23f33ebe494cb92c8a0c8d05d0814567862e5447bb0c1d93b47474b283b282a791e0a9ee5dffd989f7212106bd9d177f8f66fbbff2f32b69682cfc83d397195cce711de770098193634479d197a6e3aa24371c7d65037a9feecccec8c8b966f40dfe1314bff7b0c2e59d6ea6f3cbe20e42dae29af5069e9375d6c2f0ec6f5c3f6851bf620ec5fd3768daa3b8d156ab49328e2a9764ff06477d4a95cc7986eb98160acc920f7d83f87b30710b1725652e5e36a890ea22450d366de68668bafda0df01185907e2cd6947846b8205e3c82e352ec4189ef0afaa0ba6e581e05c3b4461a11ea27c80afb5337854107f0e1a42a220220e37d300eae3bb2f1ab8a7bb49baff64d2802e04c8e60cbbcddc4a5033f636a6c120b9f41f472cf44d6ad732fcbc3461abe4f20a623ea3f94b11c7622504159d8ca100b8946b6597b383bc106b4e974a2b75231bd41dab6b2f81d0423bbee3872b514cce791d920dc570bb3a07d608b02156aeca5b2347fb656b760d42cdbeda1b745b63c184f1a08681855797d4574a381450cb8e287482243258c428db195b395f3a92099d125836c0dc193b192e31fb449c6730ae687834aff284b294db2a23b9f6029c5bd40163b0582377bce30f91f704edafc138e13c33ceb6e9e2e615ea88115c7777b244487fbe0a37a0f5ea10cd6a86093f5b21565680e2170b4c26857f9a3ce4d3d934f13db1e9d84ff50c9a94c444a8310b80b7169a681c60b38bfe493926f7aae574421c08450cce9cd61a0dea954e42503834504013979a96e241c0e833a8961717ad3ddea226e84fc4e84621ee5c1b1cfafd9a66e7dfa7d07ddda3f42e79dcef3c26764c0c2406f0aab566344fb1ab2232ba535e21813f1f925066b2210fe0c4379b25f826ab879af42cbfb8496b173a9c40329d597bf255ea677c01109ad2e7b155965f750368de5ff5419482d51384fe58a76b2b042102e9118391122ad381200700743f8c9562437abf2855ab6c10e3addaa15074d9e0169e1fdcde913c33532f40016bc0c0efc93d166a747cfd5d97f48cea89f9fb226b3f23d29df539a013fb320e7e65840ad4db1baecd330a1edbc1d9717102704bf74ea2cf9b79febe18765231967940516911a163a27ad080c9aa875d598dc7cac1ee4700ea603fa9e999809ab3496fac39bd2f0ccacba690703d7457bb4d29ac90b259eb7c1c2f7dd765928699324310d184b067807a514008da9acb77752db9688e30489e636d4cce2ec5bd1034cbf7e2d28001fd514312399eb84b8b0380c0424710500327b1bef96a2eb886464706b8f1acc2acfa584dbdf553566a980f550a5b472d0509b9e1cf9904f6ea422935179e0a70dabe95269e67c7a405b72ddc22b16aa263b930afc69c40db87d0549a5b601d92d172996858312969a5516d0a9b9775d0be0126df7248880627fe5900e76a7a207b2363dad8bb365b8d6d54b96b75138579d53fc6f1bb6533c98820ed7fb0a0d742f60897d89605ff44775679dfab253db595e527328a9424b161888b97dd3c161e73ae32908a58c5e4322b55588e534ecaa818df90b00b2bee19f66609c97c40733dc56aa9f705a853863fc211b36a2c122328a40df0c9f7884921218ca053cb1a6138adcbb5a72edbec385f144fdb1d95f5d8584b8986a1fea018ff26b4882c719668d995669cbff410aaf2b9bd190ecb4ca0329e55d59a3a16a6dafbbc8f19d54657778f9ceb188e560345bb4ec0851ba5dbdebe1dd18acb443a364720fecec082fefd33770efe23c1dfb9d398f2f8f7bbd7135d61e43d0d249a68d289dceac88cb2b2cbaa74d3747c1fd88e19af4406eb36148db7e512b5ccdf9bdbc077b78b823398e78e5947dbabdcd2e2c4dc33d3fb5b4aa09ce3779fcbe113a4f027c307370b7d9970eb13252f1605212210b7673cdc4d81f735ab555fa71af909a3fba4d4851b6e1289a4accafedee31273028daa00da9be5ee723ec32b30d6286b44ed9016fc89e0a289d7d2ff90acb477881f80ab4e64a4cf40819426ed758b572e9565823ebcc27d196df8de7e9ac4164fc38bd865ddd848a40bdda0b169eb531cff1c84ec28580aecc3ae8efc347b52d77a48353f653d9a6ef20befe4e614d8c4e2eefd8fc243231cc6594b19dc5e97d32ea9fe801826f92ede1251c076c4607c5eda6b13ee419647dbdc5255d52d027aa8d34117208449164f437d1b6ae463ae061d134947349ddd946d146569d56600e858de7c7059c0129620381d415f27148571dbfa7cf37f5311cecd270c65948c558b9a9c5b9bc579e7b4f19dbbae1e0e30742e040b52fedfef764210393627fa435c7a69938b677d1d085a44da7c1557ee8042091b6d544196f3986fb84fb759ca75374fb57262914d6ceb0ecdd2a4bf86f90ff6a05e13bb049150cecedc7e27edf3777e449e8b6bcca9f83ba7ddd74e14e1a143f87f7d758da3c212c98b348da13955ba881c46bfe214712f33250b9b5e4dba5c5f2f1bc959c19bf28b92897ae0cfaf733734357b4e175ac4ef04378b5dcc6897d9fb5078373fafffb6b7628c61f0d92098eb8b8892cdb7aec62f8af0f3f44a57e9dbc066498519af2cde046143dc945af70141dd21553b06b19b2077759d61f26c45fac7d78244ad2a79e9bfe433f321392dfc3703dadbd4a9282f242eef5965a551096ce38b1ee08d85ec729d2d6547799f0380799aec41661d4682ac91e6e8ef05c4fc9aa7b517f0f07515fb81888f79c427bace07a95d8c2a0954f02752ecc9620e08f4f4fd9580e8a906f46bdf29fe6c8549a8aff8c838502d0856eba36cc1bf475cacde15ef35a5b8fa7fd637f6808c3f3d4381272cbad9775e266d2fbd3b2f4215cf1a96cb87dd8493f560f572f7a9d738f964096879c7ee8e439fffca48103618d1203d38bbd190490b45a0d57a926946b1cc4a02851af1729f968638ab758b417aa18d4762cf12de68b9b9036525a76da46b18f70655b083afcd4f9e62b553b4c849abc5ccdb46b78717a5405b1b7a9113b5dc76cc622ce398abcdf1588c6425774a322b97d820cc6eae943023eb755b0f91805206f989f739c026344ee5e1660ff1751dcb4fea344dfd1d7afe72ecd03622bf3bdf6edc9a177c914551ae039fa7d8f1d8b1e8e427773880096e771c7abcb916137696a38c3399477bd16b3d0898294f4003fa398bbad0a0977ac7bcef1e2c2d7da270573d26e75f1d7db8f038864cb205dd96ef3b64fc9fedd68111a81e0b5dd5bc2c529ddbd29166e6588d12212b877278a83909d825fd9e354aac4883cd04e3a038120510690790e35497c08fca3d2f53f06862595d9321b5e91f3fe23e533705e8e019882bca1bddffe82e060899ee719a669cbe273c4d93564ed69b1aa60ee55c5d9852671a66581a454b795569397a08cbf0ad53ec16d553f024ab21b525ec1012a3f1dc63cad46e5d50a63b85d02414fbcd866071518edbfae187befe5a0269c9880171605b6e965cd80dc0e461f1aa7e601c5ed5406b8f5ffb1a40fa7d71fdc4255b1d45665173784c39a0a7912912b60373e7c8460ddb3b9bff7ecd3d7d7ec3ec978b051d3b8db60b2e170e38a59f7d9c173c0772ba4e0babaa91d9e38135573b601c1227e76b590f6f249dfa26fd956852e42cdde99068a6ec86e3fa00e2fecc3cf8671e3fb909bd3fb1fed5bdf7806a626ba4e594fde1f09ed3381e1d33ccb463bd56bbfea47162cf3e00cbda61800cb48bab5519438ad4088dc933651ab7231e9ac7052aded91f828921f83e9d31480fc5ea1cba282c716fab9a846dbf15d08a8d94de4bea94623b6c56a670b074ef42c4ac64a7fe515a09be1ae9d0390cc190a132fe500860d35ce5a89f6bf35bcf877da0b12ae41c683b1ca4f636b2d327f3c29143c87ae1a23bfb30897cd5dd5412bb96c05f76c57d2bdd98e4111c7d0d86e76791ff3ec775f3170b25b5ccbed50c67cafbda7a5478bae7df0e685bf87f447cffdd0b940b55eebaef6005b55a82c9080d69a799f1ada95a8c8f46c86f75c82bc09dfaf2e2bbd32f8fda1a8ede1942a5c089155072acd4f5eec5a9807b39618aeb259ad9ce028b141799d270e04ffc3a7d82309571d5bb502dd7e4f578f25d797e33f43b57a680a5c0758d5ea6ab7b779fd487766748c1170a155091d95e9c15e7c55cf13fbcc74b1353f5a9720bafdfd9c039445a62524deda04563d726e3499ecc2677fd86edfac6e9e9381366c7cb7b352c80cd8ddb4f46439aa71c1210b6992b529f6905f7e7dd4ceb9b0750ea5f8ae37678d8e26b5594b7fae97c8573cfd47654ab91655d86553a79406d522741eeb580bdedd553d65eefef7d1e110df774726195db3e6b1e1afecb8bdcf4f67a597ae5c04ea4d5e05108e72b6e45c409f01658a74c3cb071a8c4e10c344488b0604e2f7a5e8036baa3a9110f25a3666a5eb7a57332b6cca71eee935ec4ef79250f55284fab9de6fced610027dc22657ea4857b97838373ebb9a31c60e0e95c796dc518102c44b07cd47e4d1d77ba2e10a5e1982f206796babba86c30ee3096b0b8eab46c239394c226163b31612d1cad58a6e889179400488112e62522908fe64455da6f35f3dbfe43481ef3bc03d39ad96033ddccdcff930131bbfb4b9d366ac29fed04a1cebd602b4454f01ad6e6d65adabe55478510a1485b9eee515bd22b3c8c83c6af30143de10d446d65cf38e7f3532f7f1680dbc4e140288bc801fcd5c574cd4dbe03d297dab93cd36e7545dd7fe0892c15781fc4f5934a635ced499fdcf4bdb67aac1ede811a2c6da309c2a44022f1417d4ee50344e66176923888f3eb9e31cc1bedfabad7c2ae0d33b4da13a0b31077b27990b9a49e8b409f60621c1fcfd2d12997d92fa40588926c39c351021ba8d4a8c86f13630685467b937b9b0d727ec8dd92ab92cf2da1a8f278eb2bd826a4d4ae5e3df566108ee476f9aa5f99925212e152fbdbb51dc4106a32e6ad31e5a1922523be442f7d813458a93cd41379df995a0d2f831639632e46e586cf4e83d41100a35341984a1ffe01a363b2c72d6e2fe63c4c814c8a876a8fff6152441e254d0f1ae9e23b0cb6f3e7f34ca3567e2ca3752d014e22c3c463b897df8915726087d273c599088ccd520bc0d061cb87a5fdf1a0f32b407e2b351221b4a3df50175e0ad551b81caaf58c66ac52cf0baee54119f936e6501bda450ee604bf66f4d40741702c5397aaf141df2574a84b241d23bce75432993317e2e253e3ccb1b0ed8b4a29e7b305ced34bc79d6ae50ef0fb0d64cd93f197a17f0d2f9108d4d0bc872bf8d968c3163d5d9c37b9dcbdfd70002412a439f0f04ff21d8031c8be6f401335a23096fa8309511f02119674ab5d68503a84b54e1f7fe033a338e0c1fcfee77765c7dc48534d1ea7de3c66f7fdeb2389d4f7ae11044e6837de8be4384a574412eebdbd11098c57cce8f506e65124e6c59d448942a33726644ce75c0b30c84fd6a975d558306f8da30b02d712f340bf9f038ab44396967ef55342f8444db432c835bb15eba02f03c1c5902026e2b6081d8934dd180f4e7b2f3e73ff5640b249b37d68179f644f1e469eb115c35ba711d1d89deb09b2c2b881660b3562ef09a0d207720fb85cef38356945230c081fc98a806cf0f291888c328238cef9f2a0bee8cd597e6ccffdd4b4b95a7f04698edb6fff8b0735269b08ff553a0fbeab6d15a61341f658648c76b8576a2247944ec092f49b92933eb1ec4e9fe9b8d759f64880059832691dfad9f48e680d45af8b179d3bea73a4fbbbf861ccbed8e32992928d63376ac53cbf28b18d2a9240e3e2bb5a1eef1a193a178d5964da2ad099c52a0b49656a37b2c0b4b87b1233cda78014c82013092b254db89662d221ae7af61a20b6eefb19024e73aaabe066bdf9cecb4d50c05126cce8de4c6d68cb1bb354502cf7b93f64039f439fa52b72cb63ecef606bec0de6039f93f5f91739373c3e0b22558acd598b2ba926463754cb85723a9b44e2af5a315524e2df0ef9cf391a288e1407cd2bee6b074c69c52d1e4191730bc2cca670efab13c5ac2db78a5073a764f7c331a3373c291c6e988527ba383a468088f4613dd0e46c138fd5461f141e36a34b8a8aa31df60d38750aec5dea3661dc06d178b1189026956b12aff899e357544a82c23bbaf1567e12edce0fbfce99a29a89e57ef8c40f2523eefb1e31a464d636ad33d72b711f46f8ab5e7ea38a619f65f5df79d802af07c5204576e0b240f30717043564a6b172e475d2ba503dac9cd428c068f74308e58465e8a072b32eb23b47b402e495a7b5cb52569a25b539762e5f7c1cbfaf19c815d4dd5072e4c6bcc1ad6b25fe9be734d27003195dd961ec8d4c96b613545a7f1382082aa9e5018daf203a80030f4413435e071ebbbf639c3ed061b46630941fe9ed85a4afe68e81d38899c3440af388ba2dc4ad5c007179998d1890b62ee0812e437fbf35f78ae024d83347f91ba85ee39e46e2cb95d64f7ddf01255d74e43c5476c1250563cf9271df0a77fd3223794791e107c4b89428c73418ab718936a6cfdf7621b960500a925ed2ba552fe24027abe4a3f2ffb4ee98804d47eb71ddca383ebb25dbd97b1ed1d83e378f4eba0538ad62f34e8879bdeca43f487c69557e4cb3c07027d1f76937c9684ee06917bbc84a269376e492507e1248152ce6c6a94f74cc26037c9e1e9b8d9cdf18d599b942a86006f3d9ac0da38ae21834655d440f5883779631dc190d7da39ed44915199863b1deeb22469ee59d19b0d89fbf7159112d245f7c73e0cc05b8f2fb9b4d4380e4302deeb90ecefb9a47fb429b2adbcf3013af8a5661d091666775d32828360f8b689399f12122982aedf4eb966cdc7cb71f63207899983d50f59b9d63b28e4b2b4b5f221aeaac1075b1b7c1ee0c5188d77f8113bf971545c3304f3036541c5c94d3383872de96bf0d3ee5c1b54bc9cedb494790cb1dc4fd9907be86c2307bedaabe65d64961e5a360167d95a352b157a4d6e58b3317b9d0527a66b4525a37297e518448fd2ce9f7a7314d87e2b20127b9e918537de3d4e2339a9e2948d6e1a947effde1abfde9ebac1be79288d412bcd6bc843f137cf7f170b327ba5b1f575622e42a511ee894ff270ff6e782baa9de630887aeb408ad80fcbeb800da6994856637903e2cee66bf894577ae7f64fda000e7355d6d03e5bd7a3e104112b512189f56f79d3a653e32e0ec73e7615af803f1dbc81bb3fed2985bab28971fe3d49970631c6f815c2f8e6f87e3c3eb48c9cc47a22c4348c3e42e348b867153afde4c6c40470251ef48f8ee4c26db9af1020d12a4665f1315ac59cda529550b15b0bbbb6017389652ee6124f2899329e76fb8c7006fe3eb69b6eb7af72e2bc87ff8ccdf90a043803969ac97b76294b754cc63dfb9a990d0d5f308a1b7255ed45a926feec55d87b57051d297ebfe526cf9e8d587afb35a8dd978fea14059de2c10949544bd387d3c6d7d65a82d5b30d2fd5234d733ff5bc30692e25c1fe108fa1cf10850e92456b9a53f134a80efc3bdc8a20c6a4801775c115661f831755ecbc2f427f596c859c2759c41fa126f5a838df45d5337060a44e4065e0d255237948d1430659d1572fa524f33b2384b9a4b606918ae2bfc6c4900ae5f72a612381429c71f46157b76313a6706d9472e01ebe81ed0a194c49ee0989a3d6377cd3af436cd84e1388bd8536dfac35ad5cf87f088f28a2926303cb27acd0d7275dfc1bcc9b73033e00c02b015df06bec27293be1dcb1cda749e55b1a97a40560000fc30d520639453807a1b3652bc3b151ac7b336958740db04d8e54b4c961ed33d141ba964d4696c03b710dcd2485b5f62a8aa620f4020fc59e5d9a8854167370640c0689abfcc581d7ea328e3f960286193b82981f69a9132a7dc0a809776578d4a1f226f285a8b7541a21d8e973ca3ef58a45614308690ca78dfb12b14748e9b642526340eb5d2ab57a18138ac547c820709f32886d36a5efc45254ff90902f3d0d13495919f92f532b2044678f7ea5a7b0e30defba6be5abc8eb954c3d31d4858af54933e1c5c65457914bf00cb0d40175559be3974fadab1c912c3a5e8055be72fe311645d8e058329d8f3de1202433998ee149111b4005ea563757f20b0dc478130da7e5651a46dcef16cc4b60e37af862816772c66145c78e4d6865713214536bd5ea557c97f5ac11bc50e418acad279995c974f4602944399eab4850aae4d83c78db243880f478360c1da3713244a70c5057ef74f1ee44b0e84ac5226157200fb16ebb0b81918af20997c53cdd936e193f4c71c5e9fc1fe9dc204bcea555c4eb847e35c31346e962356b3eec7fc53bf97b24bf116d0f17ad3c5b734910d97c8c79a1348ca1ce0ee1ff722cb613482a4e511261dc479d74dd28bbb5785f86af9323ccbf8e9b46d8e392f73de616a8d06867bb004bbcef70732a0a31a53516a76053f264a2fc4e74ffd0948db06d3dde01b90fc392873a899dd8f8fef81f3c12a49682e68de155e04cdb166f10532a44e46e6742c9dddd39f7bfcb989c2fdb9d19f0abf13bfee5b9e50f6c401bc456321a5836a8c16810cfad72a41ff2231b307e2810ccc27b890e8348f7c547b1e5cce9d1c420b8f795fb7654c287e814911bb3bcb740ee2b82a43e2a47463db840006199583f59a9f6285e8d9445dd12abb54f8514654a340bf1469d14c973494921989d9eaeea424b08e55ccf0a535474d60245580c7e3de49bcd9d625cf727fa7406bf93c2745eac496b6fd15d9098d7682ef9f3cc907cd5210a4deb0b88da5f0827e35e82bc9cf237efc1dc5772921284ae9e33a2afa55937879fa3899a4e723f250abffc2242815caf913e3dc88ba66fb61db78d9d375122e20229b50175b68c43244fe18508b5328f6afd61105f4f53fef366269cbcf4d72eac138b1b47a9c06ff66d530a232ac1edd27fc928a2c6f53648b626c45f5f87200eee7400f7b18f331d47de00c042cab66c81b057f6718e59abd2d23347e6cea2b82c89ebe18e4ce156953c2716e441665c8ce9e6f53446ff85eed223960480e78f39103cb103f60285678f18599d7b1c421230cecdbf6510b42717bf4e5218161802b85168ad3a7d7258071a76c9ca30d1f8a31571109a04786530cd06fabbcfc8ca85cd511fc0f4ce9f2642c97b658170946874feb530d8704f6d98bd35d5fc7c11b7a54f9294e669fea17172cb46c3a1820e4fa5a85d9abe53252db75cd310e466ecbe31d2582489adb243b942aed85889b94fb3d6acd38bef930b44e412c2b39dd52fdf092c7d0e7ec4e17ec06a97e13ddd3e365f108dd4f3f0b31cc6633aa5dfbcaed39f513b49686204c48e5750ac33aedab26b13869ebb3375fda3460571807738e8e8c0ac72db08638b6dd261b6ed869e63b0dc64688e59f67808d5ffbd3f9594abf1f79afa50e9b7ec8cb501d67d01fcb363d16fd25b68c0ef61003c68993a68483c5daa82be517d50177ab65d923ff235e51477bf47f228c0a0fe1351b185dc18adb225edf9338c6c350bc53e724d650baae3b7b089d9657d84b1c82248110723f623bdb4b4ecaf23dfcb99f5e7a32e121eeb2e7982d36aa1961bf888f25cdd27b39dc1cea7b84bc9133a0a4a5f4c119af1eed0aeec3f44b26eb56866794741f1e208d3b380dff56967e175aa9128de134e97108faaa4cbfb6bbe16bd5d9b650351dea4684fb7346ec945c1847218100dae3e88ad5088de05656b65c6434b63ecd9ff5c7837e990a2f5fa87137611fc32f05e8122b931af4f2784abf230800d0292be4138a35f1ba41e4734c7ce23359c300136affad04cfb7289d5b182b6fbbe5cfb1ec1bcc2972b6f10f8b745adb90610e346decb5cd77789bab6abfaf6bcf1af1cc5aaa988de3c5f795da1edcb0923405611d583f6a37871d978a8c3770435b4ba4587d1c7a3c89ec613f29dc387481eee53c9070f9186a15ddf37e74a483f257d2fca08ab9ec2055363011ce9ea70dc2275e3d155c98d10bf1b7d8cb247f03d6d6ed49b8d65385dd2f1a51cf18861d7e761dc0e518f1971c1cb5064f5b28f7cb6619fdaa2cb077896274c71e738ec04547704e34b93a1017e67c8fa71b77ae56f83f7e27d7dbac9401ba22483d93aade0e95f8acbbb9b86933afe6f7fc6e47131c8f53b253dd555d19b998e913cf684359fd89dfacbae2a2360333010f151e4a010a3de8ed37d0affd6395128a13d26c83914070e7390e584f3a4e7ca8744b8d1d38c7f9a7ac426c056de42fe5834b901a60cb0a675f34b449292653e6925c6b2f9015b163cc3d8682a7ca24a7d99c4fbf5bc5896e22a76ca996195be33d55d60e91c307518864fd5b1ff72e51d84c016ee4ea66213ce740e0fd3b56eaa97b9ddb53d1af67c918acec8efff49838c71ff05ed4817fab1ad0e5e8060936bb14f1aa699064858612efd8516ddb8556f93de4c20d259c2111c02ae0f855b8a9f54ebd7dce06586cfcb9f19a11d342a3fd3f7bd6afa96b1bf43f3246238b12112b3c0ee780ecf622bff8e71d5c3ea5ad34f9440aca32691b5c7d6519f8eff144782d567bab0665dc6579f9a8fa3a176019f53921b9c7d1f4cc30dea442003c01a8f291cb7641f791b253a5060b386f567f67843ae327a505f36e9249b567af8edb1751cc3463443fc7f0f96695179d0150cbf701e80e72c39ae70772a1f960ddc8a3d01403135181def41c4a0ff614feac6714cc811d6e685641efe22e899a0ae69e843b0f194fa8c8dc011395539cc63cec6ade0cf1578164876189cd4db94123f74585b7d0f9236312f877ed4b699c8d7194c76b4cec903c85746531a6cb5c56edc47054c67ebd9051cb294a73aa659d9acbd14f481957f9515eacb3f5997bb570f7db0af187702fd74487f538cc4b5c7144203d7f7c082332213f1ce6728dc1421500d1346e7aba06bbc9f24e5b397b0e914a09e9c385d50ab3b8cbb71ef84d2a781f3bfef22812eec409465117f90db1a58198fd09e6a7d67cbbd458a546b8671a19f22ba6a47e8e8a23d6f89c2b0f398716d4b0486bc435f07ee6d1d4bc604aa737f43173ec19f5180bdef5d0375b18832f5817ff262e7c5fce2a6c615135a53a27f255e2e8625b52bda6e8a7734237425207e052df40b0f4a16ba6f5bdbe2c0e1824fb07c1fc18857816e9abe8767fc2d89145af2a4a8cd09d7a9e6e8f02749151a8f8c2854a32812a33d587395d92c7f6d5ec67e8954078e1c6a5d06085d878a284e65a2709bcb37d7f8250399f321d9b10bbf7ea351bbd0ac5d18d88c537e7738d883902ae3dec14e598f4e80a451eef3548f120e4930655e2e5589177ba930995c8e22b5c1bff2e20c66cee729c85d285342c5b26e78006b7cc3915ba3cf133b89a029b0d2d0d07507002c0cc0649172390fa1b5c150f18255cedf3b1ef89bd3819caa58d702e8b716bab3a115c445d1af53f0c7a609701500ff81e5b05e5a9349ff56ff518c603f9848b323cf0b3af4122489f6111472b3f57a6a30c12c748924e0d310fec65943d4288c4ffe0adff3a695ade7241344948c94bfa5feaa39c621a2156adffe89be3fb7b36acab98aea24f536da977828650a518e1b35b728ad8c3682cd1358345373652042183ae2e4c825d1ccbf111790cc64d4bde75053a4f3365783fbd322f3e509abc247f01ea8ce280e343c97861a02b45f2ffcbd3a9c1a3eade3fcf1946c3183f6c2f3975e40190ba4a0d8347f75515b9b7651f1b0d2bea8949fd8b795ddaf0406f64c221081d481b882815fd713e56cd0080a4772bddfb19be913cc42d4a5ff78847438a85513b123c3cdf0af09d6ad4638f5e1b44353dc8bbe6624133173362bdbf8ad1c381f0dcf282dd7ab55a3c94b90ee3f310da31919d7fe0bae39f16f670984a130380a987e3acf184a89c9222bbbf3a6080a232405cc36eebc6d6bc2909f90aa65ef806c3d7f1c9219689d281145eb025f34c663f4c74a6b37c00d030f278b2ee6416a93e7690162d5eb6806baccf8200ed6536b57a9f683bf20d9ea8a6c1aa45ac217ce92ca6f5e523aa41fbd6f079e485d84cd2857d4e10db7562500bcb21b99aa282e1343c69b906768b8c6b95e01e53e270c4e49a4e9709a459d52ca2bbf05a9443a565e070c447096a208910d964247dbb5992635c2539351037f9135c924d382cb89bb26594d1abb0b743e7fe75a7bcdb10528da3239b2105f667d3221e27f72ff4f1feb49a9270a96be6b01e584c42779ff5301437c17d57de012b65c6ac2d9cc15094b750aa398b3d88b2a89b44a3c2f888dd4e300cf28c949c2492ccf8d32beb9fc3795a1e6416cb580e1d06e742691b3f1dd5714026576683f482438df64165c7d11ec4940fb4fb1cb4e2a586dc759f93a711fd578b1eb1ca04a410ac68f0e72ef8fac39e6f9ca9308df4b981d5d8a5f0af522f0623f2d906df45713c4b5edcf6dd89be7f62ff7e33e0f20a68633b9bf8a864b60d86d2e20b5fac3faf187edf3a853c1c31e91fb5948ed7c423514ccd5a18db3fa7386b84e20eb7a71b62e01b71fe807a32222b8fe2803f1ad0b2d85c12774f95ca768317ac7db886a87b1f93ac5ac31708d6b999310c9ca2535d13c95c67b75d3bcb30ce1dad660ed1b9f091c8a7c74cc5dbef4022b99ce6c5547e81a2e2a7127ce748bd8bca4aa92dba89cef711b8b544c3aeaf6d1ef7615e4da2ae8ef46a7de908fd92fbd06d112354566f21a6504c5f21df9582411dbee0530603d5e6db1ca532181a16c11496bc5727b0efa7d27202a098b14f644e2501b40f0bdda5e748f5e40b7c74267cb384d4261667130d357045c71924371112639b2ccc9f9f6dd53988c53ad22de8f22a8c87a5af6d517d84829b7533c780689ecf4edbc3cdbaf3689d4432bf44c25d19813af5f862c8b71303deb15ab3cc62da622720a110662fde6abacca267750bdf9eed58307b7d12224c12414e4ec1a0d2fb5174e263b520eb1656d01e0882642d36bac6184bbe02007c7e6f2ff0253dcb4f633ceedb20776d24255492284b2c4031bb868b115943fef3d67d823d56ff8e12db0004ad2b953ab2f8fd08da5cc16c4bc2648a8677a9ccf9153b3474423415b42dce63fbd3072bde7ca320cbf510ffd1f23b4dea6efe022003ffe8a60a9d2c984037b865fcb491007ee76c7fa84990ae17ba879997494a81c8c99011dda8ec788729fb17f4d672019cef9276d46de1ccc4bb9c5c57fe2aef0fd940120e434a33b9f5a1849b394e4b2993ee10477aee31a253020b132750c4eed0f1cd5f4f7521a8d8a2a57d8514fbcaf1014a1e215ce94f1e2cb4cd9e153035a2bc4d649b0ae44b2ae35b5c33a264939593565e4cc242ac3c18e6744259c90b1b797c7fc074e84d659abf709755e3ae5653626bafc423fcebba20551c71d82459717d434cc58c0d29345303ff0161350caaf60d96d60c7048e99a0825838df2c7ea5f52057b347a7d931b02c5477e263e3f2660287ac6766997d1f28b9519eedffc4f98efa8ff2e1f63156b260921cad116d5f38213d553c07020219ce5d0c9e46996b12fde88106a6676cd213f6959a08e8806eb4683a4f27772e87eb4809ba3ea2e7613da1abaedc5188404e7d8776ca4631f3d1c3aa8c2f570e390957d7cb381bcda1a55d9d10b7202ccba102a3acd82baaef4db8e8af0b1b1159d39cfa42d1c3d5a52bb4bd33f942d7a501db43f853f309ddb0d7b834f7d3b01ffc7a2f86f986b8d29361b1fc6c7c6a478ed7747bc4d2264b32ef5fbf00d2aa8cbf44c13889572d7f5437626dc211ac751735ea85fc3122149e1b5d3337ed67f875f8c8a132430a76d64fbf9d9a3cf0e7e4d67f502343a588a5359244e380cf09832e1f525cb61bd86761feadf358325b406effa3fc9e5d07e7b85556beee84a3420c869b765f4a1eeddea88391c205d9a1458a04120e64fb81b150991aa4e38424f392d1877aee008e6baa18a75b39d8fb68c45eee4061de0c0404925486b636a9d3b3708c82387ff0ad2198b29f9f602a16b81ff57c79296ba21c8c08cb5b80facb202de574ed7c409c86e533bfc3a3f3c94995938797d78a69f549f0b9078fab176aec69b8d26a7667da64e20e7f13fea20d4b9b529876c49f45f89bf99a5a83f26d3727c65cc59abd55e49b10dd1585330cc5225a1af1c866d6a8378ce10b437dea554a7fbd795cb33252719f3186e2477aed8d9450e30731c6a6a6a092955cd096c93bea34ec63f568629981a77abcf3c9b880cc814da28af941e9ac1d554f0d1835c0cf455d6a45bdce77e925f9f18ac3c7eb46a4aaa30adc025f2fa786d658124e4b75821e8dd10a331c06785d792080246c529e68af0df7190438257ce54a95e2da86ca24adc70db3b70fdf796f23bc60340aa4da67b49daf431a8f13424b6a6a9c61fce16d790e88ff1768409945976a6dcbcd9e453feed2aca4a18912639c004d63bcb6d669facfe5534e70bb9fb380c68c46bccb2a07b5f1e28a47b7ec3d1525a1ca90c953ccbfda46495fb4c4f6f24dd93a23bb0eed61377d49b502e75c84c5e02dd0d90f8ba4b6b12399cc36a184b47fa5589cb89212d91cf8af571c0232a8d94d12e17f5ec744e4e4955ab878aedc83192dd8da0be0799cea24a02b6f136b8650d66b0aa3e7a4470afaaaf0b5d69900541b1615245f1ed3e8f1a47f8f6d94f30dc530cb48402e5a38ac57fa97326df60e47540af5a86ab6c9ef96ac50fcbbb1e5ba0d2296fb77ff68363da3cec109055f12ff00af65e51fcf5cd141d9aff68c1cf8564d705a4bed8f419cade79b6400d7a68f0d9b9f57f5049c1caca6636aa713f956293379ef09e25743ef52eab4a2a311ab5a600fa4dbed425d0f1b4146c7bdbf169ebda4bf02ac6257cd997974cb444c0595f3713cf7e0d062e22fabb8ae78c70ae49755d50cc9a1cd3eb7d226fb4001f786759b0ba97732b266c9eed3b17680d61727949f2bd9e87eaf28369d0616ba1aa8e732b7c2b469c003956913a69ee62801b73e619b8ae9fe5025aff5a2460e643438a06d6c58fcb7b2c9a3078b8b10eb85f37b9d67adbdc11965eff8d3c5f72387c64a06a66e1d4baaee616a2a48daba582ba9ebbfc6111785425661bf19b2683b2cb418f9a159bcd6c4c4364117de86b4d9b4025d863ae5218370e09b96fef1f594b9bf8252e6d07ba651469e93acaff8e63c96c7605a0034358747e259138fcd72afb236b1e4481183eb376099f86bfd90bb91179395806ec50b46a0c3b7a0090e0dcb33fb7ee3fb74f82469447c6d1181e66c757dd2d09f25af659425a4213e262141f03ccb6cb897853e16ccef299f31efb3a5171d2104bf322c3fc4605ceb175b3f27415e8ca02b6e0b0d11a63d12ac743c40e789be969b59bec5910ffe15825ecad812fe47fbadbcd7ae9d62537fe2bc710a6534bfd90a1d292b71716cdbfb10101073a895bf4ea84e6b73d91349023fee7705c2d7194587609def80ffe1b984ce27dead1eb91244c2988594206b7ac2fa1fac52d275829af74612036f5679605c9c7ae25da3e7c4edcee24eee834a8c42c0a4437e9a6f4936fa110d4ddb1f4289d0be518663d97c111ac62048bfd0c5b8ad2e39cafebd9786ce5e2885a9846166b26db57e3cb2abea8b32e5a8132bc2d6f3644ae5b7791cef3f8f81c42ee2935469aba6c242c9412c3d042a39f17b92bfd2c39c83bb04fa618f161ad68ba30651721d7c234341ef633d821286fd9f58c4d2471b0b47140d35fecd2692744f867fc01945d2fb1746a77ac2e71a991e84be64e557b7fa03165bee279d46464a954ac347c595f975e05948c5a1a11481c3c76aa871375e2c11f63ada320e02ff138ea7c191833410f3b1a805583aa391f08facaceda78e668f6fb8c66ef83f23057436eafecf2abe228030d661d955b2db706f9e3645403e0b7657f582b762571c89044acf7504bef6dd5f84f8256c1fa257dd376b3b42b53c7ec43974128e4448fcedb050eb5836c391a8f8fed82f950dada3bc61bdf3dfa9e0a9fd1fc728b475df1ab79e68cf077817adb5e29ada6458e84a409861df341ef30fba5c4b014138d3624c2d37b06b98ec8ced95ec9e6b69a03f2b24529c171560b5b2d17ae5d1ab3b74d870d6a9cd9cd784251146372bc96b84836313c716de79af46eeb749b8d822a42755f0ad7c6220a81de213d38d07d407999198f9e32f272e53210a1a438a453c2554e25d0cf798b830573c0f6a280738478c1abec730d7f26e3e8b6403887aceb269005fb9b512749088d1d0dac51f32f6eea3fb946d12009a786ba36b9230fc358ccff4026e988e7e0fa6473dcaf9639f44414165a08eeb1afeb0ad67261e91922d479ccab1f9e8a170cd8a18ac39b6fe066934f42962683f432d661601629053df8606c611f8c0413bbc0702525343c491cf27176ddcbb2497e99a72ddea18b165a6febd3be7c99bc030fbe220dd60692e00e583f39e61aaab448decfd8d1c2aacc5bf1d1ac2d5751e6b071fef92eeea28da6017b984681552fef687de73ce152c341cf4dce66e514db613b435d7b1394e14d10975bebcf9da60509f9ad3751f1aa8afa9ee09a8b88f05da5eb52dd1b6b0867fd49fddcd28a0f6701c9eb167260b0238e05b519f0e2c98d161bce63f2f00da791e124d3d490ac4fd8a8221949dbccd804a7e5c941270bb6e6f940f673466d0f8e6e5c28602e325e704be07712c11e782c2f8a8e5e6e7e6ac7d0ef5007f0cc611bbcede879833fa2ef685eb6c95821244d0aabe66483f5810e43c53faccec9b2b1ccbbeb84a707c697c2b4c479d42714cc6c93c7572cf10c0b77f069b8d60923b20dc2a3ce7cc006e0e69fb32b52c847a7831cb1a768502a4cec519a45adcf48b62d540e464704316e4ff0aabc7ef418be6a3836881d7e3bb60e63d025b79a94c6ed39af9336ae02901e05c77c13f3191d0dc991e39fc1eb1794ab75c9da2e36c2396101be69630e71753aa34755e1c4b740741cab77bfc1b6bfeb060b02a12e1232c171621be365138019ee3008d018cf77758b97e58f6a76d169e7873c1a46a27b6d1dd418e746cef3c417106f8a165b4eff9a9439fe0e526a9ece4e649e0105f188a33f8dc9315de88f6a1e2d000b0800311cf887c8870558a548d395e0cbbf3bbfa4e63ac8aa626a429247b92408482246faf9f07d5e20f2e5d2bc73c3a48bd880ccc9b82d0915705df9df1aa4abd461a50070108cfeb3d8cdd705f9145d691c8e02a759ba268efe0aa60ebf82d4a635ecdeaf030157bf5dacb36cddac328445175c7cfddbdfebf4c78df9de4d67dda1adc4fa2c94521c2b85312afe039a4ecfc0200e9a7cd4771247b94ccaf967274f90ecae54e8e749af214485a2aef06c3aef8d795773d2377616f6f1aca0902615b6a78adc3cfb0c3855c2b76fc79158d31db035583a77afe59003d9ebfb0d2309cb7a65637ba83eeded615c7839bf01702f6eb6cb741e3c2184926947d9e19209367f7c19dac0eaa2038cbe61d7b220e8b2d8e5de72ad5f9dcea5c61292c07ef4874b3b345be55c6c691d68ce6783790477cd51f854dede866021a90ff1e992f993564da91d89e65e01036e9200e779c1fc043265a5c34df68c98fb57fa07f1351f155648f50270dab7cdfc860028f2004f8933a8c0828226b9b2f74eacac64507e3935dcc8a3fe48862765f6e6e87576d4336426387e42a04ae3a781c82319bc3fbbc0340967dbca2654ef0baeb13127f20de58e7e421b5b7883ea1dcc38d6b40ec0d00bef9b8e77698909d08d0f67ee692ea1761572412668186c8f674200a3592b63e3fb395d736cb4ab3a8271796beeee225eaecd410615794bcd1f7a8482bc3053ab3f0ad7798bd1603e0da17116075389ff83cc21f5d8ff81341a40f60676557bb50ecc18baa250c5b7a3b31b82cdd8535d213e60cabd34166778bb2334d5fcd87c4534bce09e460f7942c7e36efdffb3a9401204ebddd8bef3a487d785e9821a28e7c9f2b95869312629204f7acd72c53115b72450d1382ae88179044bf5bf1d1fd6b41f2b296a4753f53e9518b9a0f8b250a253fe39215f561d183547d0d5ebf777e40f8a9132fd371615cc794e07c17c5280a2a1ce992921183f73283a8aea3a00dc2426efb78f565807affaf32ddaeb4ed04bd8c24845a632dfbe01e741f498b97c4b25e0e965710656850221a4e4e67aaa8b3fa5d217d4d7236a81e99e26893a5ba35c3ad421c3d90f0c3f1cdd846a126a813bb7f2ee1de7ca800eeb4ab204e4b48336d358fe87700ce8fb1141f3b707e0a34f74687917c2ddfb361b8830c4babe38fa5dd24d095eefd404a8a2fb6cfd2b5715d4f8aa5d85efd662f593f06b9736198715aa1a2ca3febb298c77aeaa27a26fdefcc669de521defaacd397c274f6c5c561a3e6fdeceffe73c6195b4c67a155cd71e90e4e5f5e68bf83c882e90f5015e1da6386256a18e4f7c47cb5850c10c52ab1172a228aee378f48529f4bdfaf7a7e9ae97ad320e8d3d91740e62a5c0a09ffb34c146c417c1cf27085bdef686687a855f216731224f534b7c62c3bcdea420ee78d0be9af7d289e5ec881e70024ab7b9f44354fc14d712666841456f161ab2ae9e964c39debe1211753e81130f45ec1730e3941d68f0fd4c22d186103ad6aaf6470a045e79391db30df185fc6af9f4714cd9342a849df4db48d9574aac157c3bc61fa8e54d7ecc1cec4684112506595ac65f14348a07f2946d13b0648bc61f4198895f7bbb7cfa31305f62a583a671ebabe841cbd7573f93e3c72808356430657ace2405bb7ebc0b7f126ff3f82e3b934d741209c9b60710abddd2d7cfc3f7335e81c68421ded33fc0717f3b77a5dee487aff3cb6f9a5ec84386bc20043aba52757d7b34dac55ee9c1f0ac672651ecb1ae45a4808375d6a5418711a22ae141c3e8d113afff4adfdd7f80940182e859ca0180d26ab5fd03ccefe8770a3a32161c3b55e6e4dbf6fcadb7b6415967e73f5712790ef89dcaa4e3cb987f4ed3222605e1328d9bd3208cc80d07d8ed3bd85ecc899ab6c6cfd7ade7109c8941f5d96d2c745067c512de91d38750c150adc566d6e8fd155f6fa16cc5da30180486882bc118f845384ffd18bb0ca45c896ee76486dcb97b0ac45c2eb15a777fb174909b906b0e264da2bf9f5f334074653c531c526938e2eb5434f107b2ae72caf4181fce4f107a4d6d548e1fafe3ab6d4c85d41702b5efc0c487fe3f311cf99bb1708608848c6e68fcd9b26d0962fa422c54ba84108703a5b091409da53b236f33f48b15b4b406b55624dab5f8b6d99275b077a05072b5e383e2c1d11b9f532f9a9d91edf02478ed7d5818c5b7187d363da71cd0c6a253430dcb0973ace2e8b65c201acbeb86c72a4cd6a94c35e7656a069b27b6b0eef5b185dc0251894b2d160a9b7046b76b7b0d5a920d35496886515d5319beac9c5d5eb3016118ed7fbfc64551bb132179e0835004ad631613cd797bccbd580eb3a887325e9d7398eb48fb263f14fc9a2f034845ff9bc498eaf9a4848d30d5a9c195b320d9af5a5a17c375cb8f317621d3a6b88872369797dc03ca9dfea39687f704edf388aca5bcb96f1f76f3abab02c60aac41660bd8da34eb4102dd5318eb6e5f3aa18deb76ca6e4d26541f605392d090f05a91436b3df94b9d967c56c054e4d0f39a8618404d54615577d267bfca434ec431d527c0a34e60582d038e9009ada265532066d1d474ee1a2760b335c8ab1baadb3ba7ddcb7a7fe84a076579f4c191b6cc762e4aed38698500c733301fbf26aa19bce39b076f62e5ba2533ad54ec6bd46f4a6ec84b6761db1c6ec6496b74518ae212b9c0f443ea828a38bcf4c6144dec31870f5832f24b7b19cbd6dc0d1bfbfa7a835a55553bebfd277213262ff3816f7ca06d2876656a189bf0993fc6ed4590f1e058129608a1dd2e82c95aea11b007e4eaf60f25cb152a1486108f200d630bee2195f222938243f8a09be8f2613dc4529135c19fcdff8d1cc847a9c69a3f4f28d69ba477cfe5e03f79a0c3d045e2f5b3473537c7dff6c4018a9965cca8b42520c8d0dba36e59c30cd2c3668dad7c2cb4068a8e6f36a8de63a2c4d42d57c8956b529f3626095bfbf005437cf4660d78c5662b48fcfb3cde5f9f3223c62c5f09a05b57fff05e7776cdea44f2eea3efdc367165c4f7a559bf1a5ba72a0bc6f1a8e73784b5428400f420780af16ec7800133ee0c6f287c0e4a6046aa5e852f3b38505e6adbe9ec6bd1950c16d6cb902c313c5d0107e0a964fd946cf78d579c759993cdf9419af212960a0683efcf0c72ccbd0116e5d559dd53ced35224bc682661d34753ff4f6ba5a384a585ebf2ad58cc7d7e3ca99fa3bb7cd8e320846f719c1fe4704e54dd7aa861a91ab72dba2cf8ab6013106c453eddad3056a23fc29d48e07911ea7c38f93c50380451204428351abfe69b46df4a0fed382fe3bf2b6e90c60a5ad98f2a16229ab9984ea0f7c06ce9a31943486cac0d2467170c85355864a47531e828ee1fc96d6e89bb961585d46e33b8ef5cfa14bdcac5d88d4ef22275611e89ce81d7e8b55841060a1206cc6ccd3114d45acccea06b858c26e3e52cf72befb0d7228ed843b626870b03b2ceafc19f57a600b0e9328001040ac93413d0b14bddbbcff7976a10e6e7b6f43754e37417190e96bb0ba6d5cc46bba5f9dcd8f152ef5e216f97889eb871c389493daae87cc26163f1708c098a84670a3eaa70386f68810e0335a36792ed246e9c752e33f163dc37f6424b7fa2f08bb6b8ba84fd039412b8fb3400b776ca5be01a3538b27be2607d50b40d4663fe5b4219952475258991df64c612a03b6c15420bbef7f168f2c1e664b794930ae1a9d0f9b6a76845ea294b8561363113212b636d1cc05f985a08b50115c0d1debb9d2273cffaa78949bb9fab246cd9fe5832ba9fc06439e7c6c32f3c87d828ebfa68985b15da14bec3da7555c8fb87e049b1297058d5b5b00f1d84049cf3a2c8b92251b69d17b470a2d6ef6a1e64df0a73f924681aa2c127ca911b8e54eeab7651c8de196fd0575cec9095c1912069837b7aca6302b33891b6e8adffda04d135d4c0b06a6660c2a7793b5c30dac83626a5b16044dea631d367a607132cacf28d4f06a81a99300d7323bac36acb8f3491c5f2118736e6d9275c4c4c486834a80ab175b72638d866e4b240956c2bfe262b78ee1d2f5321a0853b402af07dc5a4d7a26ec5dd6acd1d6c0ca21f85044609f884d92761f452b178a18d55a3104e7809b6abd19dec66438248586d75e5656e819992072782336abf6fdd408e95701a2a1bc91231d77e0502ab13e1dab3be6880cd01aaa419579053d2e5542446c12bbb10fc94eab4bb58a9bb86213eb6f0f774032d4b01dd9c26f3d73b4c9a755425b76c05c013b89fe5fa63dca1b99d32c5ccf2db28745d1e9451ba712b2b74eaac6eac5281be733ba7bb1f99294b7e62360133a7113d0ced30d5a3fd6f3f1c9661570ace22564d8ddf8e8feb89e100239d4b3630d92c0da9e4325dff3c82a2618b8a88dd0029c4ca8385af37ca95a21760293990ef3fe79a328220923fb06c2dac5984a227b8af61a3c28b868c530efdfef2ee3a5455a7b986067609da454cd47961a04efdbaa85376f47ca8600ac899af7d4a1b102479a0d33578b3b2a1bf308482ecfcbade5cbfb09b3dbdb2577cdbeb9d8805da867944c1ad330123e6313061fdd93c27998654d8b2331381647bb53497a3e46fe3db59d3dacd47875b95d7f2aaca997b1c0c05986a61332e55ea6e904fc0f93ee490bd8111b6f392bd809769354f3664c3f88ae5ac43b200366ddc60696693a42da6c96f5716e69942ede3b4ac892d48a6732b4351125b68ecf56b0ee4c9f68735254a2fd3125b07faec6baea23b481b0c26f5c9f55f4245bdc1d3160fc3da1c494d47c1885a30cf96e1da75d1128e7442e3e4a8d715132fd8f2fcfeece4538f1028c5e91e53d5ca82fa12c6886c31b327c79da01988955d9e793052edca5866e6ebb086131eee7472d2adca0d943d7245c91757afdd518b9bcb01d4fd3e6302245af0159cc0b7569d07256647746c0530c392099b3c9213c5663191ba6f1d54203fb97a4b98dabad6b7b6c9afdb7390f9ad88ac9dae095cc731838ca0616457cee02b75ba6916059336b7029b0850a52b65c562ebb309c5b02d05e6c79f202a4c1f71463f7b4952a5dba5fdef72cacf92f62f17c437d24bb31ba479b39b47321d186459b139d8f4689bf1899c2810691b645cb59adb7baaea3ed5755ab68a825f08c26f2bdba409880692d28713afc189c611e812ff414db3ece6bba050222d726771995cce15bf9bf965f18ec0830d456b36774243cff4f60ecf985a1aecb318e39a03d41db66637d38c3265c470e3578bbc71f365603d6be408b42b2f6dfd85a28ad0ac37e0bea01c6e03672c77bbdefc71d9200749f492de00f53da51b9279c93ab2e5342786e438aed81bd337f4b738fd8210562458ce5a803aa7f44094510facdc829590310caa119930247eb9c31ecec55dfe2cab3e912d93b3933e2bbca977269aa4dd2f663a38400f34a974aa0c866157475c78944fb321368504af48e40673c1be06c20645d3455228e6e94b6e1a4cebf177bc0a8a5bf432027eeb0b1bee33621c6856a823646dc503e5e4f5ad5ce2877420e2a823059e33fc0831e673e12fc8c9ba02381847854183352400f333024bc17d934064c6be7316ffe5712c04ec4a60f197b983941a96a1247823989b2f15442a4463ff7773fbd9d2caadee98f2059e78204c83859231748c3d784ea46f0f3b1727aff1f3c2aabb4a3f1cb493fc304cd36900c0d5dcc85f7c68308e1a5893a91c863680fb648d2e5bed00df8422e7d8f6849a16bed00ffb4cb5c1f9f0e30ffdc69060a84461e7d61e6254906c754645e1d9476e56f720d2e92fc54b0da0a884a0e9e4e5dd24437b3c666ebb60d3432f87463e20e5c06b897d113f6f1f6ef1269acba08b2b1783d6fede668f7857bb65b9474b2dcf15aca3e619f37b596c82e285175070ebc9473e11df2c560d9791a203d3bff06792f398109a3662c08dc81e630f7d1f4b3ba956a0252b725db79e640a8b9a51cb53d7135b82d275b1634ac44abd7bdc50b4025961c65bb0e90af51527d3285506d68328db51be3adfd09fd9aa14987fad3def68f3d58f28f1f404153ac2f20471dd55aecb2d048af922c42a720d5976494c563715997583d52daeea5cef0354a04a86a68d3a9a38e8e1de4f23392e9291b17a26b21327ddd2464040cc62acfea31db896b1e27dd33dc19dc80d4c809f4d0f3fe3bdba21047fea0a3e809fb6606be5ab0ae9bd3087e60ef9294358a5ace83e2074d25bab74941566acb5b6b00c79b5f20501ba4a86178634fcc4f67c21cdcfa6eb3fbb0b4003333b1a7c0b31cb318c2e01fe1945948c0d70d37b48084db9e7ac4908c056688cfcc58612119a4350911d4e756644fe5346c7b5cc405ac69edddd1bfafc55e1ffdd6db5dd948e1a9165c6318e7b0939cf53c24f15a5a09aa4c6da20158eeb55f1fd4c87d18f626f19d622ecfaaa696becf65083cb15c6ee1e2ff9c97de30ac2fe0609ddd063d8f563d8d80a2b8093a49cfb156c1c0f61682ba99969e21f7862be238333fc4f74a2b0bff1a0f9e08bfb8963e227a0cda0bcaffe60fc1698b5e34794d8e6730336f551fb0d79aa55a2eb7a5be3b8651837b53d4c90684d4ea6899537f0df6367fb815364deb79c977dfabf95703ae23f78b52a48f945459bd856afab073343923a3bd5d59b830e44c27442430e8acf035d486ae040267d6268b18732336337053486456d483543233fe320790484ff2031224e72d141f28fbfb36598b2a7638e49ed5761589c70bc9e3de207fcd4601bfda5c698383678ff6e4f93d5c2bc28e0ad18540763b718506366db7a4d7e8c64fc8ad011c4e9e69adf0f0a7feef3761eaa3605596a1b3b381076a3254ae9856fa9391255a458d5a1723b286b2496ca951dae336cd9733e1c91e4af1e50d4d0f0c1ea62a5fd7f081d8af3b58176cd093963b4b4ecb39de8e55938da4337eaa55fa0d9be05826f874c1b2f282311e85e902bf4eda793475841e62f46c85a44e4edaa61b03091edc2c415b552c88e225fadb827bfd0018fd19287726e435789fa9360388c6569e6363034667e28a2760842fbda084ffd901a66c58d08633dd61270c0206a60540d370f3374549627833cf7cef98110643bd06b4a02b8c11dbcfe6432d24fcbaa18ac7eb3a457abe4857de4b3b189e2570de891898a9a2295355126222fd01895a49d6287ea3b593da4e0e285e3a82c68b60ce6674aa6570adacb02eb7f78f93ca36f562b0a02d7728f9630764a4560665985ac79b4ee13138f4f8d27b721e3b9dcb1eef67d6c560f4ed7077c62948b5fc0431e0a050372a5d073b266382a6a9904e6b43fc4ee464a0003a1db962237684860acab087f6e0a458845c7400e9ea9d534a8b7c9dd4881fb267006ff220e76366efc40e0e5eb501ca0112636e6afe8cdd7227d517e84a6e02e5261cbde938c1e3fff10dacea9935c1302e40df7aa42278933bdf1c68a92bd89c7feed604be7ca687c9c0d017a03f9630d40a904eb164f0258d0831bce1d4b0e028870549da3b80c865bcce1ce4b3afeaacb4835af67ddafc5db7dc24c9696390fcb5566bc939b0bd18d6151a588dd2b15e98fb4ff2705faddba4923cc105701030929a7f844bbecb3fe03bea05beab5432e082ee2ba88661215024dc0b936ca41dacbdcae016f1ece630ba774b0bc84f2440d417f35125112428c335f73797cfa8a0e320276f441eec6f11d2099b72138f817a6273794fe699244b72c0866176adec0f093112e78b185e58d3d79b5124e974faacba714d34bc3772fe65da221e8a0c82451c3130c7ab2bfb53d1ebf95d130d1b1ca7815c31e51e634e7995d2b8709706600b26df755ee8be3e53acf16411392106cc2934f25d076fef95800926ea45809597a757bcd10edb2d645c798814e3237434928b7291ce52622fce05271ddaea13cb3528a5af00346f05b0067afbd5e81031fa67db11814a785aa542b61233c7313d4b9cbb443e962e2d606a1342ad90936b63a8f037913f70f92da39ce7a28b39e605d866d35ea10c737f723c665b1ac94624a3cb1210f05cfa107ed856087a572abace8acc0dc1c5a5574c297b8bb8a61211c6c3b0bd0a42f093775c8e277a94d03b4ef64a6fbe77bb0f49dc3541ed7f93361852a4ed44f1f7bbbb005d469336d9ea07bcef1821a72b79914fcafc60408d818b7fbc27f8b7532eac870ccd323591fcfd8a5d73ba3bd3a4c3bc0e49829214ae21a264961c67b2ea0de2f54f3f55db7fdfac43c7c2d589ac908f8762d8b3709426a9837863c78c6d8fcc9dfd453d22865259506ebd7aa75577f9984634db50aa0f30f28488979112473a11373b78cb3dc525f45ed32b6ceb28ff0e3b42f7b08057407e6081be6002f99316feb4aa462341409f915ded78861e1829d627bd9d664d4eacae4e1d5663f8623427fb5800beafd359c89ea0c4652a952c73e04fb5fee2412939a591adfcb7c41ef9d02e234c2e642ca3754ef6bb7aaaf0c592b01631ee6e95d9dcc8028a8de4368f78dfae307c80176a48d1ad5c45e6b562cd000887ad03ae942f66db084332a493d01d5ddfda25caba840b8d801311e183f0f9cd2c26218258a25209112aba5c19a6c39004670f2701c0d0a15ab8426686c4bd1908eb7d719b7571a4ac397d04773ed6ed01dfa8404d500f76191c09055bbbf7fe91daca833ccf72a78f65fa7709f2cafb6beebbef2f1bd4acac6d4575832127bdf52efbb2353af6c0863706e1c52455402e15836bcd63b6d07c5b05cf0399ac3d395b200bdaa9fc69e54532fad79b85616486b7786d543657a7397de0e16513632798b1ac795eb8eb1e18cbfb0dd42a9b006218c421eac27193d61c94dd9eec89b2ae565307b51e9065ca9ed6a6690d7a788ac2ec775dc25ea7eeb8824ed67991c3d6132e13e7ef51b2a012e255a9b5a0464c617bca1b03e9d25d3d016919ec3657664636ccb8e2395161aceba53a2406e3500400bd4aa5cdf622ceed268b136ad62cc5c929246ac45c929b0ff5f215492d46c95dc9f81c9239a14bd0fa24f1a946038791a66e153ef02d0a97d7fe8322b1a0830b6316102ec89124868d356911b3ee85378678ac9a93d95a90b07a3c3d1b0f54b0916675f2d7edc0453c6a32b99ba7cf11068e870f767fed851d69fbffd65de35441d6beb094c56878532bb7f501332955520d3198db5dbabcef1f2309e4876cdfeaf20209d1ddabbb308801d745514fae4c27ab47998553123ba35ec2103ab4befedfca943ac85bf6e2dacb2c857188aa412e46a0c33ae3e2532764c14218aae69bf5cdcc50e20c826218367b82f71a55136baeb37bb2c55d417c1471283f7f596e8d143f5ffb2b913ee62da40e8b9f5878f076c2a72090e01e53b2d1386a2ab8b181aa2fc96828cdda76683126f18cab10501236d3bc3be3c3eb12716721d81bf8c76cc45050938571d291280da40a86df5ff14a8031e1b0da47fb9076511d479c37672ce88f1cae72009e251e761d9fbefe04f4c0ebae61cc08f42d7fa483daa24c88c58cbab958d8367328ffa607152141fdc5b8035fad63201e72867a50a7c1fd51aa99e2e95de1bbd3731a00c80a1a53435001110101c36e64b4b2d15ab10ea42ff411326f00a23fcd77db6fca99d5d722389a123853e46b640ad5905cf5a0196ad6fdd144c80dc2b87070193fb22db4e89bcee5fb0fc717535246148fba4ab0f8bcf68d207e99a25990e4ec092940c68f0d378a6a9c0a2d2501e9459bafd98984ff41abd7797fa081d188a977a5074ef19112fe0a0638fccb15de4051f72933d918c0dcaf30024d5b5563233741b609f64b4f055f73fefa4c902f54686da16da20baafda89efc718a72d27a4d3a851a0913677d643ba813a13aa83aaa7a50ba3cf63fdb371da5614b8e49e77dacb2462cf7600100057856616967a6ba62b92147106bf1e1c745ca5073f5d2dcee9cfdc46d0b192acf1fdc31fad32abf849956c2c4941752e196c91599ee5268789fbc25ee5eb106eea31606462109acb0bac8ee1c61c5ff5c9f763effb2007428fad96ba395513c989039870f4a5fbb758a4c738309e0c702bdf67d511778da8422fc1162591bd58ef633133a246b04208c5d1894af8c3d3744ead3c4b6d128fd21bb1d86d17b84666c66866e0658b91091927f52368baa612abd0fe6de10234306712c724385045b2913c889d45177c06f5e46d5d444c66742f93e12f6e6eecd6e13c315fd29ac409a8307816c7a161acd488c776d7e9726e3176d72484e6cd6d0da27d3ac412e4fcb8e878dbe89b2f4e97e4dc43bdebd4c0b4d0be76aeb732f41ee7789a87f0f9abe67873cea6c1afd70af2406bf5b08cfe3a56597296e59ca69bc10c14ed2aafbd47a812c4c6eebfef8760330a85b7f99b2de5f79ff593d5df174c6378186f7606554bc4abdb5f0812ab59616e3d0cd499ce29e4dad900a72c7cceeb25f9121d235e254279b4bddb62cb10f2e24f072508dee35698e754c8d9f93a0e41130ef0b6ff8be4b99743433f14eb7bcb2be0d36c94f16a1cbe5be879fe5718af41aa4acfab9cab98acd27b06269f5c228f0350cd3a28310f2ce7eb9667bdb96292e0de74eccf3da4aeaf6188bd23868fea2b11a97df1919d324d0db526989fad9f86d27d25cf2daf3467e4af3866be219c6d8d7342fac442fc95fded53f5e9a9d5e252091b3a5b7f720c8c502e9911bb0c4d8ba2d86e5af10e4d53d128e2d9a3e58ec24e9d717da4a6d720f81c1cfd404f9183b429e47cff5909a457fbd35f32e26c44e8d7cb6ccf19e3eb5e167cccff1e35aee54f4ea871f571948328705c79005ea2e83ec0fc505f98dbcc9b0438db3a254caae3126edf86d89a00619fb41852db6b7bda08c55bb811357448a3144d147e41595255161c3124ddcd561a2a5d5f334135fbf15dcc27a2196ecd07d71adfc269ce8e7fae10e119d8b6759aafd682962750a686de50b1a4c6a4e6e63aa685b9b2122f284ab87cccf78e9ae16314d725045fee4a8004c3520e0d0c0aeeada0f67ea5d09cf43da75ea8299b07489c50e6a8d7a3743c46f1548238862c9f0c403ecef6f9db86e6e891e0d8c1198c01b53234c0c0e7fbf1fe99cbd26b15a3c61b6b5bfa87b60fa794ed6b9bbca6360ec849369711b92ddcd2daef9445f9e7088f7dda790de5693f03e373fa325c4fe2932708d0257f1c684fc7b44b8614c2f5b0ee413e20a574348196def9aa09e639aa7fe257a7748a5e5b8db2beb8c2830443fed2ae42d02a0935fb11c4738f5845bc595a01f4dd84b28a2230b80687a02c5c0e924e97156e5c40c4de37a612764ae66b97ec7b989e48c21a9f282b5c1c5be570a2d562445f167a09400a538d3497e2715518aa019c5ecdd14b8a13e96066dafc03ad9a4d3dad2ab51762eef686dc6686b465c1f9c74320ab84d93e90bd6ef085b0d8696dba0c799060c9cfe0c6d99ae67af1b8dd840c100025836f60c4d2aa3e49fddb10e712a0916aec746cb4211889f8ca5ea02c4fa7724321b8fe0d23b48545bfccb24a5256ca11f57aca1f6fe8ee23b2bdf334e478df42c7399dcb95c1b802fe7faaf72bdf8a0d5a15277530d57552d6e26be0eb3f70c98c96cd3508178eef2b1a9b1fbd68e6589860cd8b7b76c134857f7c61d246d4f383fc45c74396b003df5127d9e9786aac2fe0bb6c5504f211dafc3963cb90702d7ecb2c6db110ad8e73e60407e85ef23b932688c8271245f63097f5a809e40329d8019f5e97d57bf4cab12e1d42c5c75ec32a330420bd5db027c5858cc8aa1260336b2a7f0fdf00351e5f53ecfab67613e8e1906d33bf304f1fd18a49986022571d1d4233677c63e757938f2406290ec9fd45c23bac857438a193bd9c4bd3279634c5fca4a15e98dcf948fd64853884d19860aa4fe8790c07e096fe602e1e410d5e87e0a6c6d0f347b0b19a18e630b713f488e8d6fad4111a15a060658f3c9968949591c1c9ca6502130c5c3967f4e748d8086ac0be9eb0ee051fadddd9edb0af909b56111397c1c3d6517f5a7d9f0b5283a8e8859d00e6c2513e782c6a98d5935e1fb685855b14b5d1e4d15fe4178af0ae8414187d2154218a44dfca23407b6a799b0436382c9b44c5b85b16caf9eeee11f9fcc619ae6bbca75f20d2fe11e676d1bea608204755f3b686088b8d0f585938b90df602713684df95c4d9ea83395f724d1c0d9b6045eae72c6fbd22933224c3454032049fd8f2d925ac91b786cdf0c60c649650044bc886aa4033f76a0bfbeb57389dc4e2c239151fe11a1be857739f5514b8de19c06efd556509d445b0b512a5eb7a8583c0c25420ad6bc8b7ffcb238a5e2b0b8627c4f8860838cd54c36cf088636a6d9cdaade8f8ecd0c14767da3f2b16d10e8237d9076e778d6cff28da60b1e03f4e196648e8e2558f7865b921cea2907b64d1c278d2cd436c6d9b4d6c16e9a2d75f2da2c6276cfeb179c8eb7ffe254c429c4d0c465b1d8dcacd89bc5a88bd14922281d7ff6cd7e511556934b2f75a36af3bf0d886f024fdc2a9878a680a6eaadfa1143a195e42746cfcaaa53cad02d0be55b435464b863719de7b516f246a427f2aec57869f265d28cca069e16242dab8d06cf1642e3b6e153956e0b08790746b3f3af010bc5730762318ae87dcd3cc3f7436a305760a2befb6e0cff18f5e77fe1d931dfb46a8ea18fd656763af431723e7a10b72568fa922d7e657c0471ca9c83a9abf4209c6d9dc68a783ed8d416236e75ac30ad8bfa4c8dd3cc80711c6154a98c41859c1d8a2e6854a3fe352fcde2c006755d4286c3b3349be17634aa0cda9e8c69ac0f5c2ff7d518df7831c0950215efa64bd1a582a65d5e489062d717d8f8cbd0e31fe6ec0331ab0fc6e661018ae71437526ff3d48a9af9d677875281904faa745583ec3280a7c842fab4de4824ea0756ec62a645308834f6226be1f980e1517611ec104bd1b53d221e062a7f32a2663c46f4d4ba7d15ce4e8d37524ecc57130c6ed21b9c180275dd46b9c3ad71c0200e3abb9a662ae5f4159b4d7ff25dafe5c5dd3afcf4024a14b147571d4a892fed8660956bd5c594e0adfbe3266a39ae886871f7d130e73e75d583761df63a1c49237e1492d657158806c39c6ba2fc8e06216873fa126ad5e705d0dd1cbbc6d6b45050ef1f44c35cfbdec2f8c985cb72accb479592aeeb28682bacf5d0d388baeffbf5e007b39e73b9a5b6e3f43f8a3dc0ff5d59448967a9c132050bdc462385119534800ff85d069e0245970f255e0f39ae37e1f3e767009e21408ff2a93e3202db7fcfcc578bd13bcaad1abb725f286dde5a047703779127a6057f013e7afceddd208389add6a60f2e87e2b64eb00539eab0f28facb0c06a4fd3ebfbeaf34deb6e88bce5c2422e330912d884426b083c758e007860c4ce9ff0712fbe06b448c5e4b80a94a26812195b5ebbc09e282206d81d68cbdf1f2623b9ca176795940ad3bfba6edd136e7bdaeacb4561da88a09dc1517304a8942de9ae3fd09671efa8743da5d1bdbd77fccc434bde102cb4e25914b7cfd8310ac85409fcf79ea2507e07ff695fab13a3b39e5f11539d62a4e34bb6ede91088f3744a8af4316382edc7cf2aa8d881b8ac11aaeee2fa20917fe2c163d280c92796dc7fa42ed475d04928e0b6d7dbf710b274c03563794b3c6e0c733dafffbd653ad499ce8909a9fde2060b860a4bff6a5e42c3b7c61c712a3c1ed02060c206ac8c5a9d1726c2d1ea89fabc66437458a57e2692374830714808b5b14046adf00f8cc83ea8066195cf695a068a937369329f9a5128415c9e8e3f4dfb233fe9383b370b36b8538d43cd025f65934b6d474b14b2d95c0a05347322d19e9fd2198661b627ec1a1f042125fd1257190aa7bfb9b921d7e7f3b80c80004693d464ff2ee6385cb73a5b22f1caa243ef581156189063ccc1af76d832384f5484d9aec1d3582296bdca2573867ac9040549e98260bd162f6cde712035b001dc65f5ba54ca2133b802e212549136bea809b238c2757df7c4fabd2c20b9432098804b2f0725594e36c51ba3d0cfba98afec0626e7cc0d3e9dbfc9451a0f16afdf6d7850e780c1387a1848a9e84af65e008869f9227e26d59b7a82e7ab88d3a3ee12e77e0ca04e0605e44208e3197c4ca5b97245a0eeb0d5bab2b74e62cb86015d6e5d72d7a6fbb68bdefb0833dd56c6c60c475548fd1a36bced13313f631f247a9837c7f4a1aa858837b632d781381e5feae081011522b17e9485a34798358aa0dd74628be6b9b20b0aca00069f171c3c250650e327548b4ba2ef09f488677bf2d6497e594face98a7f2ff46807fd64af20e7cf5fbc3c2e00166b099677ce1e1020c3afbdca7d5ef7a40e7bff5b6a651fd2aeed2475140ed7a3cbef2506957a1fc865702080617cdd92b0f7c7857de351aef84cc862d532a033561755451cb769ef11b87a0bb7831d9a05dc65d37adf0b5192179db9d4bc9feae894313da224d389fd38ea2deff7d31c9ffca861a90662bc2fa2a67b3592b44b734533807f262a50fa5771d51b41a1d399cd8cc539f0e3fe2a288e92fa5a877a768238a87f2f35bd63de77de024d369bfbf0d4894225c4c7fe8525a6e16f6f3a7c3573b0180c185e55a379d4b3ca515503cf5a9703dc41f0307af7f4f48fa62c3b43af7566fc16ad0c7ce3c43b8cf527065314082a71cc2273cb28ba16acd37795c832446a0fbb8722443748541bda5e2f76d5af00a4f7a5ba70fa1dee4dcbe00ef76fe5de519dab44f3a6973175d14be0048e91e7042ba897c1a8374a96129baf9ca8b2d86b7143dc6665032bbce51e86941444c6925fe6efebf5ab560ff9a38c319d6c37d26e80662f89da9564b0dfb47d2969654ec786c0e2817ea510912ea403f774442c24dc8499acbb317c2c434d5858125a4ff13b31b8ccd08359d142482d48190711b07b079c8c51d14b3a07936e773bac9634c073b8218ca13762d075e55d5afbe05d1e1b2c285e1979ad21e2435ed562fae3eeb582baea4a03945eea593ca8758340be29c630b77fac3f6090394ace8a276d90ac80888949cabed05b22c03e20c723cf7d79eddb84a96cd2fc53c41a072b781b8eb768994362120d49146e73ef72c31f5c04071275053662a38d7171a772af330631292a00921e731d60c1067530d861653dfca4b8c668e1d1d62a17c1857e6e1d60d782de69f635454b1e47bb7854d18be9f4a95128f75093785fc5ccf5434bd827b1d80754ffcc5918f240f4f402521520a07c37505929a3ca2a426459dbbb3a4faf7fdd19d8a85696fef64b6867b39005e0d8311fa7e4508fe40702d576ba3e35e94b489ccf27252f3ce143f9e1a61701914961a4d3895e312b37acc0b45e2e0500bb675dc5e1dba91fbf772c23e45ec17dda18937173d988c33ecc518d665adf3af4ec69dd21aecf835c65722e4ff74f6e820eb04ab9af04b4b6c706be729af9c7af793daf9361849a24f31ba2f6f5d6fb69783c0f6604b116ce3fd3a1082cad8d1a2c24271b89d62eee22aa73cfca22508a87f3c946a0f423b48606992676825eb735f7f6b2089e0ed1f352eb08ae5c5a7f4cbcfdc0cdca5ba40f3e0cd0b0b351be3b2957e8af807f22176464c1198f0962d6dad5cec3268c1f1b0b23b28c3e7041b5f65a7161d82df3598f30d24c21557772a2a075345d1828e01f9acad73933e5f1642c2f199cb3f4d97388253af1d6edfe3ff85e4fe606df77916fb8bba0ddff17c0945a246dc5b41708f15b0110d7d1ea310cf3a3c70e41bfca06eb92d91ebffbcbc61de7255153a882ac8a615a8d8b596c647612d5a00d0b6e6e47de5ba46d8a70e7f2b04792c18cd1b97958b6d4c0be4d7c96adb9eac1b3d7eb4596c57345614cba83e8994bf47a353690af6eef5e5de2bd1c6255eea59f844661c150cee8e63561c0ae57ff8dce77f18d54d10dcb1d181e75f93898eb68090a4b38b46d26415d5047bb311f451a6fbb0f8040c7f86fde67fd3c6f005a03364dd4adaefc7d365291fb80f7256d268355ef772862851abc469bf245444e1bf90cc6d516a8b92792af1a742dfa8d82be641e02c41d281dd29179342c1e08e4a9cbf827465c2b30e4562fd65a6abaf20f30e56df48c4abaa3fbfc17efb54ac8537187c6418e15730e80d288eaf73c03d5ca9b9e281f1de06bda2894631b895ccf46fcffb6bee5f3b53e013f8217a06d474a8c88dc222268bbe3343374204f7cd50771b64232fccb9923d8a11b48687e8b1965da902a2d9c7fc168744257dde00a61c163cd054e2b1d3be4aa30bb69d92871bada48e68d4c169803c0b883420a51c4112747c4584071ce266a8a3bcd8b5495f14bc0de8cfc893bbc9dcb73781464f6a9c4261acff3de845044fce56b42607f878ce32f906490a4e7ba824d4f13165c774af52dcbc349528d9de998f8493ba3b6ef67211005bae70350efc60b3b8d8b8d34d0e0c06865a294cd4588190a544efa971017233b0c0913207ac4829bc0111764a936a1bb5c6261136c558006e607e2af567b4b9bf21d65c463af3d6eb5c5c9e8817214dbab3ab8a3c1eb3f9e370f8ba17d2b3d7b4980ba9486e2aaa25d3a6ef82cc73d1d7e3ff75f1ad1986cf6ce73d3c8aa86e8ab909118e1658320eaa6f40291a511c92668fc8addf6de80c57978e42d39cbfcd841d39952c6a4efb73a4271c3bfe03145251f49b0d55d1f401b817b2615c8dada403ca2ca5309d1ea8b64c5ff938f09f99cfed3773d01e41535b677b851e467bcccfa150b91dd66958d18a4f498d90559b0abc32688a380a7a73758e048093ebc2662709ccb89767e1debb3f9a4cc1ec87464737c700f7236c3807de3b4e5416c427c02c7744bb6d9ad33988f43f095d1a7a13c0e2f8ff58ade34f4938f4160e830fb07dc19938d6a5361a75e4d29bbb4e8be999cd9e51a603149f544165df03d856f843d11542aa5f2c57dc0c294e7e23e696255c7c3a6ef407ad0932695c34368917e40086069bee62b3dec764dc46c43b6b0c6be4a416be5510efa5f4c2e8eb269e8229024de63264fec71d9948d2beee90b6dae7e6459e604e8b524e7376e1894fd21f4168f3b20866a6b690543bbb33e910291b86c210ce72c8260985faf50201783645ce7f50434736feed9650fdc20dc0c3160a499a68d7c05fa2b3ec5c711cb076cfcbf593ba5460aa2f22164a3081229021907224d068dffec843dd2d6e585d9708846d45658de6a4e1e1fc8d0260d6ba5666db91362b50dd3001b256a392ed94c984dca59a8cd1c017a5a56c8c419d55e1747fd42143a85634ac1e0036be5ff1ddb92a913c4d7b053757d70f2615f947fd965456e39eb91f90efcc220efd47b893005a50b565175fbd0a7772e4fa8c1c6a69a409b38c80269732afecf7e02ac7c72adb6ec43193f0789cdf1c26f21444f907282771a949fc9b49e90c3833a913de1b1010acba81041a628833c30285a79c4d5052989af41a6cbd7506f27cbc19e3d666e0599e7ed883bec91bb5d48d7a6781a0252a0fe2c54539de6f08df65f7d5678cbf171f886501b3a5d860338733c987c31d3215405cb2d9427bd64c1fdda19f8f16bc0400a2010af60e1302e52f1bf42b4729987b86792d3e9e66362768932ee6f6e630113f1bf2ccf084f97d494819bfdd38c633c8cdbcc5f61438fbfdc4098c06f4a0afd180892e04069d6b9ceda5512045f98e63a85c39750693a47d67102f19baffc88e01f55b6eab0464681a220fa0d28575d076ac1ff902507218612573e9c3c0a079ddc6bf9e9c1f1f60d21603c92cfeb99e57e224db694caeb59cab2cef35a1a4bf8359034cec654604416393620876b50ef28528ce006c5e06b8c097e439584badaf1b08cb642c9b16399c4883456b902c316e374a572899aab926f48d893424dc4bee4ed54d11f50ed72ea43a1a11528e092fc96588940364ae164cbe512b07e8611614e9b852f518f62a9b76d28622ad9eaca9ae06721206a28800de84ddc81711fdf56640e33c0e6971952d7626aaa3c14a0d0b64613956f5230e9f3dcc270f459303fb1cb59247e14c3cd7b2731c76970edd87f1cf4ed8934f7f230b8edb14e658482c9e1122203d089119b17d99c84165ef7c6eb6cd71f50e86b88d2f734d9e5e2beaa2e929f27021d88bc504de1ae726a5a448fc3944258cf783fab41e3a10a7a8a7a25d1eaa244da290a06e5e03281340895c6e6803d00aa418d7c436e6a78d60a5e494963cf2f687de9287c12012703f0e268905e74be143e6cc4becf9b3add3767eeffe17d065a8719532725aae95a7621ab01838ce9857e3c553a05b6bddb3b35da16954604e3c01a364e29106d307ff201dc13d8346f4fc8959eba72ae4ef248378a818b216f7fe6a0c143e58a2609ee67279f078012b78b4f238a43e7ef176f6917beb4c359c831706fce501f6b3ba02c6bfd04a0af038fb4d7fd2a2d8d743d56ef757e8a45c8dedf0346a88f1ebd35b87ed4a09eb9bc413e657c879c065d5fffe6130619a300693c89e151f9e26f1b658759dd20de6307d0d13e1643a6e0413d9edb05f5424f7c02f00551fa05599dad272d9af46386137573d9b810b8073fd3703e58634ecc692e8607c40f541d10daeaec96b8cf90f6cbaa4e4bfcaef854b6d04e4079c7ed7ab00fb178290aa1e8471450b6811286b7aab1af85662f10ec32940770b88f1e03b29af718bba03db59d4edc9f00a5d030efc11a4e90a2a82f797668fc76aa4789b0460ba7b4e8e455336d5fad0c2cc5e30c87a9442a785553cb3e22bc9c2f7958a8610dc666e665f64a21003e996e8af4a51b8c9af4e4785882574b2b383667f7e7b041aeeef27449d1bb202bc6c88353c1d53fc7a7cbba2cdd6755f229928b78f5e40d78e284be3e685d5f11a2f7590cba4c7d9a34728d41b6842e3b511882c3adbb5be96d5f1c6de3469b2efa49f3fe72f668ace7d15f0e7ad07c5aa965c686a4e5c26884ecf097a7c6a34e3a79845610f1a9663d5fda954368025f666bfe66c34d8ad8618ce116bcc934d19ad05a85ee0d996180457f537a655df0a3c8d1a7d715512ce5563f99548239c3691c38fde85bee2a4f3f9b3e5ca92dab0018c40d208882600740e0a0a6806cbf311ac0921679988fecfefc25154e023e96b58f4fe55d1377e9c02debae506eff043bad0579fe106d16a3f0c6fcc7907594076fb61df72f969e12d902eba</script>
  <div class="hbe hbe-content">
    <div class="hbe hbe-input hbe-input-default">
      <input class="hbe hbe-input-field hbe-input-field-default" type="password" id="hbePass">
      <label class="hbe hbe-input-label hbe-input-label-default" for="hbePass">
        <span class="hbe hbe-input-label-content hbe-input-label-content-default">Hey, password is required here.</span>
      </label>
    </div>
  </div>
</div>
<script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">
    </div>

    
    
    

      <footer class="post-footer">
          <div class="post-tags">
              <a href="/tags/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/" rel="tag"># 设计模式</a>
          </div>

        


        
    <div class="post-nav">
      <div class="post-nav-item">
    <a href="/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/Design%20Pattern/19.%E8%A7%82%E5%AF%9F%E8%80%85%E6%A8%A1%E5%BC%8F/" rel="prev" title="19.观察者模式">
      <i class="fa fa-chevron-left"></i> 19.观察者模式
    </a></div>
      <div class="post-nav-item">
    <a href="/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/Design%20Pattern/17.%E7%BB%84%E5%90%88%E6%A8%A1%E5%BC%8F/" rel="next" title="17.组合模式">
      17.组合模式 <i class="fa fa-chevron-right"></i>
    </a></div>
    </div>
      </footer>
    
  </article>
  
  
  



          </div>
          

<script>
  window.addEventListener('tabs:register', () => {
    let { activeClass } = CONFIG.comments;
    if (CONFIG.comments.storage) {
      activeClass = localStorage.getItem('comments_active') || activeClass;
    }
    if (activeClass) {
      let activeTab = document.querySelector(`a[href="#comment-${activeClass}"]`);
      if (activeTab) {
        activeTab.click();
      }
    }
  });
  if (CONFIG.comments.storage) {
    window.addEventListener('tabs:click', event => {
      if (!event.target.matches('.tabs-comment .tab-content .tab-pane')) return;
      let commentClass = event.target.classList[1];
      localStorage.setItem('comments_active', commentClass);
    });
  }
</script>

        </div>
          
  
  <div class="toggle sidebar-toggle">
    <span class="toggle-line toggle-line-first"></span>
    <span class="toggle-line toggle-line-middle"></span>
    <span class="toggle-line toggle-line-last"></span>
  </div>

  <aside class="sidebar">
    <div class="sidebar-inner">

      <ul class="sidebar-nav motion-element">
        <li class="sidebar-nav-toc">
          文章目录
        </li>
        <li class="sidebar-nav-overview">
          站点概览
        </li>
      </ul>

      <!--noindex-->
      <div class="post-toc-wrap sidebar-panel">
      </div>
      <!--/noindex-->

      <div class="site-overview-wrap sidebar-panel">
        <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
  <p class="site-author-name" itemprop="name">zhengyidi</p>
  <div class="site-description" itemprop="description"></div>
</div>
<div class="site-state-wrap motion-element">
  <nav class="site-state">
      <div class="site-state-item site-state-posts">
          <a href="/archives/">
        
          <span class="site-state-item-count">39</span>
          <span class="site-state-item-name">日志</span>
        </a>
      </div>
      <div class="site-state-item site-state-categories">
            <a href="/categories/">
          
        <span class="site-state-item-count">5</span>
        <span class="site-state-item-name">分类</span></a>
      </div>
      <div class="site-state-item site-state-tags">
            <a href="/tags/">
          
        <span class="site-state-item-count">7</span>
        <span class="site-state-item-name">标签</span></a>
      </div>
  </nav>
</div>
  <div class="links-of-author motion-element">
      <span class="links-of-author-item">
        <a href="https://github.com/zhengyidi" title="GitHub → https:&#x2F;&#x2F;github.com&#x2F;zhengyidi" rel="noopener" target="_blank"><i class="fa fa-fw fa-github"></i>GitHub</a>
      </span>
      <span class="links-of-author-item">
        <a href="mailto:zhengyidi1357@gmail.com" title="Contact Me → mailto:zhengyidi1357@gmail.com" rel="noopener" target="_blank"><i class="fa fa-fw fa-envelope"></i>Contact Me</a>
      </span>
  </div>



      </div>
        <div class="back-to-top motion-element">
          <i class="fa fa-arrow-up"></i>
          <span>0%</span>
        </div>

    </div>
  </aside>
  <div id="sidebar-dimmer"></div>


      </div>
    </main>

    <footer class="footer">
      <div class="footer-inner">
        

        

<div class="copyright">
  
  &copy; 
  <span itemprop="copyrightYear">2021</span>
  <span class="with-love">
    <i class="fa fa-user"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">zhengyidi</span>
</div>

        








      </div>
    </footer>
  </div>

  
  <script src="/lib/anime.min.js"></script>
  <script src="//cdn.jsdelivr.net/npm/jquery@3/dist/jquery.min.js"></script>
  <script src="//cdn.jsdelivr.net/gh/fancyapps/fancybox@3/dist/jquery.fancybox.min.js"></script>
  <script src="/lib/velocity/velocity.min.js"></script>
  <script src="/lib/velocity/velocity.ui.min.js"></script>

<script src="/js/utils.js"></script>

<script src="/js/motion.js"></script>


<script src="/js/schemes/pisces.js"></script>


<script src="/js/next-boot.js"></script>




  




  
<script src="/js/local-search.js"></script>













  

  

</body>
</html>
<!-- 页面点击小红心 -->
<!-- <script type="text/javascript" src="/js/love.js"></script> -->
<!-- 鼠标悬浮 -->
<script type="text/javascript" src="/js/mouse-float.js"></script>

<!-- 鼠标点击爆炸效果 -->
<canvas class="fireworks" style="position: fixed;left: 0;top: 0;z-index: 1; pointer-events: none;" ></canvas> 
<script type="text/javascript" src="/js/fireworks/anime.min.js"></script> 
<script type="text/javascript" src="/js/fireworks/fireworks.js"></script>
